HSQLDB 内存设置的 HSQLDB 约束违规和 SQL 查询日志

Posted

技术标签:

【中文标题】HSQLDB 内存设置的 HSQLDB 约束违规和 SQL 查询日志【英文标题】:HSQLDB Constraint Violation & SQL Query Log for an HSQLDB in-memory setup 【发布时间】:2010-03-29 21:41:11 【问题描述】:

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

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

2- SYS_CT_286 到底是什么?它不是我的专栏之一,它是生成的专栏吗?有什么明显的问题吗?

谢谢。

【问题讨论】:

【参考方案1】:

有什么方法可以让我看到正在执行的实际 SQL?

我不确定 HSQLDB 是否允许记录正在执行的 SQL 语句(如 select),但您可以为此使用代理 JDBC 驱动程序,如 P6Spy(已在 this answer 中提及)。

SYS_CT_286 到底是什么?

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

【讨论】:

【参考方案2】:

HSQLDB 保留一个重做日志,这对于调试已运行的 sql 可能很有用,但我不确定它是否对内存数据库执行此操作。如果您将数据库临时更改为名为 test 的基于文件的数据库,则重做日志应命名为 test.log,但它会在干净关闭时消失。

SYS_CT_286 很可能是具有系统生成名称的约束。同样,如果您创建一个基于文件的数据库,您可能能够查看它并找出它的约束条件。如果它是您定义的约束,您甚至可以更改您的映射,使其获得一个合理的名称。我知道无论如何你都可以使用外键约束来做到这一点。

【讨论】:

问题是数据库随着测试的启动和关闭,所以为了维护日志,可能我需要做一些独立的设置。我会先尝试 P6Spy 解决方案,谢谢! 对我来说听起来很明智。让它使用基于文件的数据库可能有助于诊断,但您必须稍微修改您的测试才能做到这一点。另一件值得做的事情是使用 org.hibernate.cfg.Configuration 中的 generateSchemaCreationScript(Dialect dialect) 方法为您的数据库生成 ddl。如果该约束是由休眠生成的,它应该显示在那里。

以上是关于HSQLDB 内存设置的 HSQLDB 约束违规和 SQL 查询日志的主要内容,如果未能解决你的问题,请参考以下文章

具有 hsqldb 脚本文件的唯一约束违规异常(未读取空格字符)

HSQLDB:奇怪的“唯一约束或索引违规”,从 CSV 读取数据

HSQLDB:奇怪的“唯一约束或索引违规”,从CSV读取数据

引起:org.hsqldb.HsqlException:基数违规

Hibernate 和 HSQLDB 违反主键完整性约束

HSQLDB 和内存文件