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

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

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

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

谢谢。

【问题讨论】:

    标签: java hibernate orm junit hsqldb


    【解决方案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。如果该约束是由休眠生成的,它应该显示在那里。
      猜你喜欢
      • 2022-01-23
      • 2015-11-03
      • 2018-01-10
      • 2015-11-01
      • 2014-11-29
      • 2016-06-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多