JPA 2.0外键约束

时间:2012-03-13 14:00:18

标签: jpa jpa-2.0 constraints foreign-key-relationship

我有简单的OneToOne关系:
数据< - > TherapyResult

我想表达以下限制 与JPA。

  1. 如果删除了 Data 实体,则应删除关联的 TherapyResult
  2. 如果 TherapyResult 实体被删除,关联的 Data 实体应保留在db
  3. 使用JPA第一个约束非常简单,因为我可以添加 CascadingType.REMOVE

    @OneToOne(cascade = { CascadeType.REMOVE, CascadeType.REFRESH })
    private TherapyResult therapyResult;
    

    对于第二个约束,我想添加类似

    的内容
    @JoinColumn(columnDefinition = "DATA_ID BIGINT CONSTRAINT THERAPYRESULTDTAID FOREIGN KEY (DATA_ID) REFERENCES DATA (ID) ON DELETE SET NULL")
    

    然而,这不起作用。 OpenJPA似乎有类似的东西,但我想使用JPA 2.0和EclipseLink。 OpenJPA ForeignKey

    另一个解决方案是使用 @PreRemove described here,它可以工作,但对我来说看起来有点“非最佳做法”。不过只是一种感觉。

    我的设置是: Eclipse 3.7.1 EclipseLink 2.3 Apache Derby 10.8.3和/或HSQLDB

    任何帮助表示赞赏, 缪奇

2 个答案:

答案 0 :(得分:2)

您不能使用纯JPA来指定外键...该规范不包括该功能。 JDO是唯一能够定义FK的标准。您必须使用实现细节,或者自己定义模式并让JPA impl在其上运行。

答案 1 :(得分:2)

如果您有从Data to TherapyResult的外键,而Data是该关联的所有者,那么

    如果cascade设置为REMOVE ,
  • 删除数据将自动删除TherapyResult
  • 您只需将therapyResult字段设置为null,然后删除TherapyResult即可获得所需内容。另一种选择是将orphanRemoval设置为true,在这种情况下将therapyResult字段设置为null就足以将其从数据库中删除

如果你有一个从TherapyResult到Data的外键,而TherapyResult是该协会的所有者,那么

    如果在Data.therapyResult字段上将cascade设置为REMOVE,则
  • 删除数据将自动删除TherapyResult。
  • 删除TherapyResult会将数据保留在数据库中,前提是级联未设置为TherapyResult.data字段上的REMOVE