【问题标题】:how to enable referential integrity in HSQL Db in-memory unit tests如何在 HSQL Db 内存单元测试中启用参照完整性
【发布时间】:2011-09-25 10:12:24
【问题描述】:

我的整个 JPA 后端有 200 多个单元测试,它们都在 hsql db 2.2 上运行良好。我在连续构建环境中运行测试以验证系统的稳定性。除了当我在 Oracle 11 上运行它们时,一些测试因参照完整性约束而失败。这是由于我的代码中的一个错误,但我在 hsqldb 中找不到它们这一事实让我感到担忧,并且违反了拥有一个轻量级内存 jpa 兼容数据库的全部要点,但它并不真正兼容!

是否有一个设置可以触发 hsqldb 在运行测试时考虑参照完整性。我怀疑默认情况下会忽略它们。这些是我的 jdbc 设置:

jdbc.driver=org.hsqldb.jdbcDriver
jdbc.url=jdbc:hsqldb:mem:SampleProject
jdbc.username=sa
jdbc.password=

【问题讨论】:

  • 一个数据库不符合 JPA,一个 JPA 实现是。也许您的 JPA 实现在 Oracle 上存在问题(因为 Oracle,我们应该说,在各个领域“延伸”了 JDBC 规范的条款)。

标签: jpa hsqldb


【解决方案1】:

您可以使用: “设置数据库引用完整性错误” 和 "SET DATABASE REFERENTIAL INTEGRITY TRUE" sql 语句

【讨论】:

    【解决方案2】:

    HSQLDB 对引用完整性非常严格,除非它被关闭。 JPA 实现实际上在这方面针对不同的数据库使用了不同的策略。例如,对于一个数据库引擎,实现可以定义具有级联删除的外键并删除父对象,但对于另一个引擎,它可以在删除父对象之前单独删除对象的子对象。

    因此,HSQLDB作为开发数据库在很大程度上可以帮助您发现错误,但您仍然需要通过运行目标数据库来验证您的软件。

    回到具体问题,如果您使用这样的文件数据库运行您的一项测试:

    jdbc.url=jdbc:hsqldb:file:/home/db/SampleProject;hsqldb.write_delay=false;shutdown=true
    

    然后您可以在测试后使用 DatabaseManager 打开数据库并检查表和约束定义。如果 JPA 确实创建了外键,那么您可以在尝试一些插入和删除操作时自行检查 HSQLDB 是否强制执行了约束。

    【讨论】:

      猜你喜欢
      • 2011-12-23
      • 1970-01-01
      • 1970-01-01
      • 2011-09-17
      • 2013-08-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多