Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/jpa/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java JPA DBUnit HsqlDb:是否禁用约束检查?_Java_Jpa_Hsqldb_Unique Constraint_Dbunit - Fatal编程技术网

Java JPA 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会抱怨某

我的应用程序只从数据库中读取数据。没有创建/更新/删除操作。我正在尝试将一个DB视图映射到JPA实体。此视图没有任何唯一ID。所以基本上每一行都是唯一的。但有些列的值可能为空

现在的问题是:

1) 我无法对数据库进行任何更改。它超出了我的范围。因此,无法为视图添加具有唯一ID的新列

2) 我不能创建没有主键的JPA实体,因为它会抱怨它至少需要一个唯一的键

3) 如果我将@Id注释应用于所有列,那么它在逻辑上是有意义的,因为在我的例子中,每一行都是唯一的。但在我的单元测试期间,HSQLDB会抱怨某些唯一列可能没有空值

4) 所以我决定推迟/禁用所有约束。因为在我的例子中,约束只在使用DBUnit和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]

有两个想法可能会有所帮助:

  • 将具有复合主键的JPA实体映射到现有数据库时,@EmbeddedId是实体与多个@Id字段的正确方法:

  • 创建具有多个@Id字段的第二个类,并用@Embeddeble注释该类
  • 在实体上创建第二类类型的单个字段,并用@EmbeddedId注释
  • 此外,由于它在只读模式下使用,请在@Id字段上使用可插入和可更新的@Column属性: @列(可插入=false,可更新=false)

    这可能会导致JPA提供商在唯一性问题上表现不同

  • 对于类似的情况,我使用ApacheDerby删除了引用完整性约束。我认为它也适用于HSQLDB

    您的问题没有说明在什么时候发出删除约束命令,因此请确保在需要删除约束的每个测试开始时发出这些命令

    我编写了一个“ConstraintManipulator”类来删除和恢复约束。需要禁用约束的测试称为正确的ConstraintManipulator在测试前删除方法,在测试后添加方法(只希望某些测试中禁用特定约束,并在后续测试中恢复它们)。这些方法只是使用dbUnit配置的JDBC数据库连接发出DDL命令(“添加约束…”,“删除约束…”)


  • 有两个想法可能会有所帮助:

  • 将具有复合主键的JPA实体映射到现有数据库时,@EmbeddedId是实体与多个@Id字段的正确方法:

  • 创建具有多个@Id字段的第二个类,并用@Embeddeble注释该类
  • 在实体上创建第二类类型的单个字段,并用@EmbeddedId注释
  • 此外,由于它在只读模式下使用,请在@Id字段上使用可插入和可更新的@Column属性: @列(可插入=false,可更新=false)

    这可能会导致JPA提供商在唯一性问题上表现不同

  • 对于类似的情况,我使用ApacheDerby删除了引用完整性约束。我认为它也适用于HSQLDB

    您的问题没有说明在什么时候发出删除约束命令,因此请确保在需要删除约束的每个测试开始时发出这些命令

    我编写了一个“ConstraintManipulator”类来删除和恢复约束。需要禁用约束的测试称为正确的ConstraintManipulator在测试前删除方法,在测试后添加方法(只希望某些测试中禁用特定约束,并在后续测试中恢复它们)。这些方法只是使用dbUnit配置的JDBC数据库连接发出DDL命令(“添加约束…”,“删除约束…”)


  • 我通过首先使用以下方法删除主键来解决此问题:

    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文件。如果只从数据库中读取,这会是一个什么问题?如果你从不写信