我对@OneToMany和@ManyToOne批注存在一些问题。
我有两个类的Suite和SuiteVersion。 SuiteVersion依赖于套件。所以我已经在我的代码中实现了这一点:
class 套房:
@OneToMany(mappedBy = "suite")
@Cascade(CascadeType.DELETE_ORPHAN)
private List<SuiteVersion> listSuiteVersion = new ArrayList<SuiteVersion>();
类SuiteVersion:
@ManyToOne()
@Cascade({org.hibernate.annotations.CascadeType.SAVE_UPDATE})
private Suite suite;
但是,当我删除与SuiteVersion相关联的Suite时,我遇到了一些问题。
Hibernate不要在Suite之前删除SuiteVersion。我不知道为什么,因为我在代码中提到了这一点:
@Cascade(CascadeType.DELETE_ORPHAN)
这是我删除套件时获得的日志:
休眠:从SUITE删除,其中ID_SUITE =?
2010年8月13日09:40:50 org.hibernate.util.JDBCExceptionReporter logExceptions
注意:SQL错误:-8,SQLState:23504
2010年8月13日09:40:50 org.hibernate.util.JDBCExceptionReporter logExceptions
GRAVE:违反完整性约束:外键不执行任何操作; FK42895651EA304E6表:SUITE_VERSION
预先感谢您的帮助。
最好的祝福,
弗洛伦特
附注:对不起,我的英语是法语。
最佳答案
但是,当我删除与SuiteVersion相关联的Suite时,我遇到了一些问题。 Hibernate不要在SuiteVersion
之前删除Suite
。
那是因为您是,而不是,将REMOVE
操作从Suite
层叠到SuiteVersion
。为了获得理想的结果,您需要类似以下的内容(假设您使用的是JPA 1.0):
@OneToMany(mappedBy = "suite", cascade = javax.persistence.CascadeType.REMOVE)
@Cascade(org.hibernate.annotations.CascadeType.DELETE_ORPHAN)
private List<SuiteVersion> listSuiteVersion = new ArrayList<SuiteVersion>();
我使用完全限定的名称在此处清楚地显示了Hibernate特定的和标准的JPA批注。
特定于Hibernate的
CascadeType.DELETE_ORPHAN
是另一种用法,它用于告诉Hibernate 如果从集合中删除特定的SuiteVersion
,则将其删除(不更新该SuiteVersion
记录,以删除指向父Suite
的链接,但仍保留在其中表,因此是“孤儿”)。请注意,如果您使用的是JPA 2.0(即Hibernate 3.5+),则现在有一种标准的方式来处理孤立记录,即无需使用特定于Hibernate的注释。您可以在
orphanRemoval
(和OneToMany
)关联中指定OneToOne
选项。像这样:@OneToMany(mappedBy = "suite", cascade = CascadeType.REMOVE, orphanRemoval = true)
private List<SuiteVersion> listSuiteVersion = new ArrayList<SuiteVersion>();
但这超出了这个问题,因为这实际上不是您想要的。