我对@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>();

但这超出了这个问题,因为这实际上不是您想要的。

07-28 02:11
查看更多