Java JPA DBUnit HsqlDb:是否禁用约束检查?
我的应用程序只从数据库中读取数据。没有创建/更新/删除操作。我正在尝试将一个DB视图映射到JPA实体。此视图没有任何唯一ID。所以基本上每一行都是唯一的。但有些列的值可能为空 现在的问题是: 1) 我无法对数据库进行任何更改。它超出了我的范围。因此,无法为视图添加具有唯一ID的新列 2) 我不能创建没有主键的JPA实体,因为它会抱怨它至少需要一个唯一的键 3) 如果我将@Id注释应用于所有列,那么它在逻辑上是有意义的,因为在我的例子中,每一行都是唯一的。但在我的单元测试期间,HSQLDB会抱怨某些唯一列可能没有空值 4) 所以我决定推迟/禁用所有约束。因为在我的例子中,约束只在使用DBUnit和HsqlDb创建内存模式期间考虑 我试图执行以下准备好的语句:Java JPA DBUnit HsqlDb:是否禁用约束检查?,java,jpa,hsqldb,unique-constraint,dbunit,Java,Jpa,Hsqldb,Unique Constraint,Dbunit,我的应用程序只从数据库中读取数据。没有创建/更新/删除操作。我正在尝试将一个DB视图映射到JPA实体。此视图没有任何唯一ID。所以基本上每一行都是唯一的。但有些列的值可能为空 现在的问题是: 1) 我无法对数据库进行任何更改。它超出了我的范围。因此,无法为视图添加具有唯一ID的新列 2) 我不能创建没有主键的JPA实体,因为它会抱怨它至少需要一个唯一的键 3) 如果我将@Id注释应用于所有列,那么它在逻辑上是有意义的,因为在我的例子中,每一行都是唯一的。但在我的单元测试期间,HSQLDB会抱怨某
SET CONSTRAINTS ALL DEFERRED
但它失败了,出现了错误:
Caused by: java.sql.SQLSyntaxErrorException: user lacks privilege or object not found: CONSTRAINTS
我不确定在初始DB初始化期间如何禁用约束检查。我在过去已使用以下方法禁用了外键检查:
SET DATABASE REFERENTIAL INTEGRITY FALSE
而且它工作起来没有任何问题。如果您对如何禁用HsqlDb的所有约束检查有任何想法,请告诉我
Jar版本:
DbUnit-2.5.0
Junit-4.10
HSQLDB2.3.0
JDK-1.7
更新1:
我将我的HsqlDb jar版本更新为2.3.4。我找到了以下参考资料:
然后我开始尝试在连接上执行以下语句:
SET DATABASE SQL UNIQUE NULLS { TRUE | FALSE }
但这没用
更新2:
我尝试使用以下命令将这些列显式设置为null:
ALTER TABLE T_NAME ALTER COLUMN C_NAME SET NULL
但我的错误是:
column is in primary key in statement [ALTER TABLE T_NAME ALTER COLUMN C_NAME SET NULL]
有两个想法可能会有所帮助:
有两个想法可能会有所帮助:
我通过首先使用以下方法删除主键来解决此问题:
ALTER TABLE T_NAME DROP PRIMARY KEY
然后使用以下命令删除单个列的NOTNULL约束:
ALTER TABLE T_NAME ALTER COLUMN C_NAME SET NULL
正如Jeff在回答中所建议的,编写单独的类来禁用单个测试套件的约束是有意义的。我通过首先使用以下命令删除主键来解决此问题:
ALTER TABLE T_NAME DROP PRIMARY KEY
然后使用以下命令删除单个列的NOTNULL约束:
ALTER TABLE T_NAME ALTER COLUMN C_NAME SET NULL
正如Jeff在回答中所建议的那样,编写单独的类来禁用单个测试套件的约束是有意义的。如果只从数据库中读取,这是一个什么问题?如果您从不写,那么为什么“HSQLDB抱怨某些唯一列可能没有空值”?@a_horse_with_no_name:问题是我正在使用DbUnit framework和HSQLDB作为内存数据库编写junits。在执行测试之前,它获取我的JPA实体并尝试使用它创建内存中的数据库。一旦创建了数据库,它就会尝试将数据插入到每个表中(这里的视图被视为表)。然后HsqlDb抱怨违反了约束。仅供参考,插入的数据会更早地从实际数据库中提取并存储为xml文件。如果只从数据库中读取,这会是一个什么问题?如果你从不写信