2012-03-13 61 views
1

我有简单的OneToOne关系:
数据 < - >TherapyResultJPA 2.0外键约束

我想表达以下约束 与JPA。

  1. 如果如果TherapyResult实体被移除的数据实体获取删除相关TherapyResult应该被删除,太
  2. 相关数据实体应保持在DB

第一个约束与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

另一种解决方案是使用@PreRemovedescribed here,它工作但对我来说看起来有点“无最佳实践”。然而,只是一种感觉。

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

任何帮助表示赞赏, 缪奇

回答

2

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

+0

这似乎并不有效,因为JPA 2.1:HTTPS://docs.jboss。 org/hibernate/jpa/2.1/api/javax/persistence/ForeignKey.html – Piohen 2014-10-08 10:37:47

2

如果从数据到TherapyResult外键,以及数据是该协会的所有者,那么

  • 删除的数据将删除TherapyResult如果自动级联集去除
  • 只是
  • 你需要将therapyResult字段设置为null,然后删除TherapyResult以获得所需内容。另一种选择是orphanRemoval设置为true,在这种情况下设置therapyResult字段设置为null是足够的。如果你有一个从TherapyResult到的数据外键,和TherapyResult是的主人,从数据库

删除关联,然后

  • 如果在Data.therapyResult字段中级联设置为REMOVE,则删除数据将自动删除TherapyResult。
  • 去除TherapyResult将留在DB提供的数据级联未设置为消除对TherapyResult.data
+0

不错,但是如果关系是Many TherapyResult to One Data,并且ForeignKey是从TherapyResult转换为Data,会发生什么?怎么可能:去除TherapyResult不会删除数据;删除数据会删除所有相关的TherapyResults? – 2013-09-23 14:56:06

+0

删除治疗只会做到这一点。如果数据与治疗结果的关联具有REMOVE级联,则删除数据将删除治疗结果。这就是协会级联的意思:在实体上执行X时,还要在关联实体上执行X. – 2013-09-23 15:00:55