JPA2.0外键约束

JPA2.0外键约束,jpa,jpa-2.0,constraints,foreign-key-relationship,Jpa,Jpa 2.0,Constraints,Foreign Key Relationship,我有简单的一对一关系: 数据治疗结果 我想表达以下限制 与JPA合作 如果数据实体被删除,那么相关的治疗结果也应该被删除 如果删除了治疗结果实体,则相关数据实体应保留在数据库中 JPA的第一个约束非常简单,因为我可以添加CascadingType.REMOVE 对于第二个约束,我想添加如下内容 @JoinColumn(columnDefinition = "DATA_ID BIGINT CONSTRAINT THERAPYRESULTDTAID FOREIGN KEY (DATA_ID) REF

我有简单的一对一关系:
数据治疗结果

我想表达以下限制 与JPA合作

  • 如果数据实体被删除,那么相关的治疗结果也应该被删除
  • 如果删除了治疗结果实体,则相关数据实体应保留在数据库中
  • JPA的第一个约束非常简单,因为我可以添加CascadingType.REMOVE

    对于第二个约束,我想添加如下内容

    @JoinColumn(columnDefinition = "DATA_ID BIGINT CONSTRAINT THERAPYRESULTDTAID FOREIGN KEY (DATA_ID) REFERENCES DATA (ID) ON DELETE SET NULL")
    
    然而,这不起作用。OpenJPA似乎也有类似的功能,但我想使用JPA2.0和EclipseLink

    另一个解决方案是使用@PreRemove,它可以工作,但在我看来有点“非最佳实践”。然而,这只是一种感觉

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

    感谢您的帮助,
    Muki

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

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

    如果您有一个从Data到TherapyResult的外键,并且Data是关联的所有者,那么

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

    如果您拥有从TherapyResult到Data的外键,并且TherapyResult是关联的所有者,则

    • 如果在
      Data.TherapyResult
      字段中将cascade设置为REMOVE,则删除数据将自动删除TherapyResult
    • 如果在
      TherapyResult.Data
      字段中未将级联设置为删除,则删除TherapyResult将在数据库中保留数据

    如果您拥有从Data到TherapyResult的外键,并且Data是关联的所有者,则

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

    如果您拥有从TherapyResult到Data的外键,并且TherapyResult是关联的所有者,则

    • 如果在
      Data.TherapyResult
      字段中将cascade设置为REMOVE,则删除数据将自动删除TherapyResult
    • 如果在
      TherapyResult.Data
      字段中未将级联设置为删除,则删除TherapyResult将在数据库中保留数据

    不错,但是如果关系是多个治疗结果到一个数据,而外键是从治疗结果到数据,会发生什么?如何可能:删除治疗结果不会删除数据;删除数据会删除所有相关的治疗结果?删除治疗只会做到这一点。如果从数据到治疗结果的关联具有移除级联,则移除数据将移除治疗结果。这就是关联上的级联的含义:在实体上执行X时,也在关联的实体上执行X。很好,但是如果关系是多个治疗结果到一个数据,并且外键是从治疗结果到数据,会发生什么?如何可能:删除治疗结果不会删除数据;删除数据会删除所有相关的治疗结果?删除治疗只会做到这一点。如果从数据到治疗结果的关联具有移除级联,则移除数据将移除治疗结果。这就是关联上的级联的含义:在实体上执行X时,也在关联实体上执行X。这似乎在JPA 2.1中无效:在JPA 2.1中无效:
    @JoinColumn(columnDefinition = "DATA_ID BIGINT CONSTRAINT THERAPYRESULTDTAID FOREIGN KEY (DATA_ID) REFERENCES DATA (ID) ON DELETE SET NULL")