当 JPA 插入继承的对象时强制执行 FK 约束

Posted

技术标签:

【中文标题】当 JPA 插入继承的对象时强制执行 FK 约束【英文标题】:Enforce FK Constraints when JPA inserts inherited objects 【发布时间】:2010-09-21 13:29:21 【问题描述】:

我在 JPA 中有一个使用联合策略的多级继承模型

@Entity
@Table(name="PARTY")
@Inheritance(strategy=InheritanceType.JOINED)
@DiscriminatorColumn(name="PARTY_TYPE",discriminatorType=DiscriminatorType.STRING)
public class Party implements Serializable
...


@Entity
@Table(name="PARTY_ORG")
@DiscriminatorValue(value="PARTY_ORG") // value in party table's PARTY_TYPE column that dictates an Org.
@PrimaryKeyJoinColumn(name="AFF_PARTY_ORG_ID")
//how children clients and orgs willmap to us.
@Inheritance(strategy=InheritanceType.JOINED)
@DiscriminatorColumn(name="ORG_TYPE_CD")
public class PartyOrg extends Party implements Serializable
....

..继续使用子类

但是每当我尝试插入时,底层 DB2 数据库都会抛出 FK 约束错误,因为 PartyOrg 的 PK 也是指向 Party 的 FK。

这意味着 JPA 在尝试持久化 PartyOrg 之前必须持久化并刷新 Party。 (我已经用 manul SQl 验证了插入没有 Party 的 PartyOrg 是错误的原因。先插入 Party,然后是 PartyOrg(具有相同的 ID)工作正常。

所以

我如何告诉 JPA 首先保留***类以尊重子类/表的 FK 约束。

【问题讨论】:

【参考方案1】:

发现问题了!

DB2 数据库使用浮点数进行 PK。当我的 DBA 说“使用浮点数”时,我从未停止考虑 DB 世界和 Java 世界之间的不匹配。事实证明,DB2“浮动”应该反过来调用 Java 双精度。在我将所有键都转换为双精度后,一切正常。

我只能猜测浮点数中的舍入问题导致 FK 不匹配 - 但这纯粹是猜测。

【讨论】:

以上是关于当 JPA 插入继承的对象时强制执行 FK 约束的主要内容,如果未能解决你的问题,请参考以下文章

MySQL 不能用 FK 约束插入

我可以用 JPA 命名我的约束吗?

违反 PRIMARY KEY 约束。无法插入重复键

为啥泛型类型约束不可继承/分层强制执行

使用触发器强制约束

带有没有外键的数据库的 Spring JPA