我的整个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=
答案 0 :(得分:2)
您可以使用: “SET DATABASE REFERENTIAL INTEGRITY FALSE” 和 “SET DATABASE REFERENTIAL INTEGRITY TRUE”sql语句
答案 1 :(得分:0)
HSQLDB对参照完整性非常严格,除非它被关闭。 JPA实现实际上在不同的数据库中使用不同的策略。例如,对于一个数据库引擎,实现可以定义具有级联删除的外键并删除父对象,但对于另一个引擎,它可以在删除父项之前单独删除对象的子项。
因此,HSQLDB作为开发数据库可以帮助您在很大程度上发现错误,但仍需要通过针对目标数据库运行来验证您的软件。
回到具体问题,如果你用这样的文件数据库运行你的一个测试:
jdbc.url=jdbc:hsqldb:file:/home/db/SampleProject;hsqldb.write_delay=false;shutdown=true
然后,您可以在测试后使用DatabaseManager打开数据库,并检查表和约束定义。如果JPA确实创建了外键,那么如果尝试一些插入和删除操作,您可以自己检查HSQLDB是否强制执行约束。