2010-03-29 38 views
0

我们在这里我们使用的是嵌入HSQLDB在Java支持休眠/ JPA单元测试设置,我们使用的是内存数据库模式,因为我们只是希望在测试运行后抛弃数据库。我的问题是,其中一个测试由于违反约束而失败,并且HSQLDB将列列为SYS_CT_286,并且出现在日志中的查询是准备好的语句,我无法查看实际参数值是什么(它们被替换为'?')。我的问题是:HSQLDB约束冲突&SQL查询日志用于HSQLDB内存设置

1 - 有没有一种方法中,我可以看到正在执行的实际SQL? (例如mysql查询日志?)。

2-什么是SYS_CT_286?它不是我的专栏之一,它是一个生成的专栏?有什么明显的可能是错误的吗?

谢谢。

回答

1

有没有一种方法中,我可以看到正在执行的实际SQL?

我不知道HSQLDB允许登录(如选择)正在执行的SQL语句,但你可以使用代理JDBC驱动程序一样P6Spy这个(在this answer已经提到)。

到底是什么SYS_CT_286?

这是一个约束(我敢打赌一个唯一的约束)。

+0

谢谢,P6Spy是个不错的主意,会试试它... – shipmaster 2010-03-30 15:36:23

1

HSQLDB保持重做日志,这可能是已经运行了哪些SQL调试非常有用,但我不知道,如果它这样做了一个内存数据库。如果将临时数据库临时更改为名为test的基于文件的数据库,则重做日志应该命名为test.log,但它会在干净关闭时消失。

SYS_CT_286是最有可能与系统生成名称的约束。同样,如果你创建一个基于文件的数据库,你可能会看到它,并找出它的约束条件。如果这是你定义的一个限制,你甚至可以改变你的映射,以便得到一个明智的名字。无论如何,我知道你可以用外键约束来做到这一点。

+0

问题是数据库启动并关闭测试,所以为了维护日志,可能我需要做一些独立的设置。我会先尝试P6Spy解决方案,谢谢! – shipmaster 2010-03-30 15:42:05

+0

听起来很明智。让它使用一个基于文件的数据库可能有助于诊断,但你必须破解你的测试。 另一件值得做的事情是使用org.hibernate.cfg.Configuration中的generateSchemaCreationScript(Dialect dialect)方法为您的数据库生成ddl。如果这个约束是由休眠产生的,它应该出现在那里。 – 2010-03-30 17:49:07