gpt4 book ai didi

java - JPA DBUnit HsqlDb : Disable constraint checks?

转载 作者:行者123 更新时间:2023-12-02 03:16:50 28 4
gpt4 key购买 nike

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

现在的问题是:

1) 我无法对数据库进行任何更改。这超出了我的范围。因此 View 无法添加新列作为唯一 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

我不确定如何在初始数据库初始化期间禁用约束检查。我已经在过去使用过禁用外键检查:

SET DATABASE REFERENTIAL INTEGRITY FALSE

并且它可以正常工作,没有任何问题。如果您对如何禁用 HsqlDb 的所有约束检查有任何想法,请告诉我。

Jar 版本:

DbUnit - 2.5.0

Junit - 4.10

HsqlDb 2.3.0

JDK - 1.7

更新1:

我将 HsqlDb jar 版本更新为 2.3.4。我找到了以下引用:

http://hsqldb.org/doc/guide/dbproperties-chapt.html#N155DE

然后我尝试最初在连接上执行这些语句:

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]

最佳答案

两个可能有帮助的想法:

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

    1. 使用多个 @Id 字段创建第二个类,并使用 @Embeddable 注释该类。
    2. 在实体上创建第二类类型的单个字段,并使用 @EmbeddedId 进行注释。

    此外,由于它是在只读模式下使用的,因此请在 @Id 字段上使用可插入和可更新的 @Column 属性:@Column(可插入=假,可更新=假)

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

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

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

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

关于java - JPA DBUnit HsqlDb : Disable constraint checks?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40175512/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com