Hibernate,Persistence和@OneToMany以及@ManyToOne注释问题

我对@OneToMany和@ManyToOne注释有些问题。

我有两个Class Suite和SuiteVersion。 SuiteVersion取决于套房。 所以我在我的代码中实现了这个:

class级套房:

@OneToMany(mappedBy = "suite") @Cascade(CascadeType.DELETE_ORPHAN) private List listSuiteVersion = new ArrayList(); 

Class SuiteVersion:

 @ManyToOne() @Cascade({org.hibernate.annotations.CascadeType.SAVE_UPDATE}) private Suite suite; 

但是当我删除与SuiteVersion相关联的套件时,我遇到了一些问题。 Hibernate不会在Suite之前删除SuiteVersion。我不知道为什么,因为我在我的代码中已经提到过这个:

 @Cascade(CascadeType.DELETE_ORPHAN) 

这是我删除套件时获得的日志:

Hibernate:从SUITE中删除ID_SUITE =? 13août201009:40:50 org.hibernate.util.JDBCExceptionReporter logExceptions注意:SQL错误:-8,SQLState:2350413août201009:40:50 org.hibernate.util.JDBCExceptionReporter logExceptions GRAVE:完整性约束违规:外来关键不行动; FK42895651EA304E6表:SUITE_VERSION

预先感谢您的帮助。

最好的祝福,

弗洛朗,

PS:对不起我的英语我是法国人。

但是当我删除与SuiteVersion相关联的套件时,我遇到了一些问题。 Hibernate不会在Suite之前删除SuiteVersion

那是因为你没有REMOVE操作从Suite级联到SuiteVersion 。 要获得所需的结果,您需要这样的东西(假设您使用的是JPA 1.0):

 @OneToMany(mappedBy = "suite", cascade = javax.persistence.CascadeType.REMOVE) @Cascade(org.hibernate.annotations.CascadeType.DELETE_ORPHAN) private List listSuiteVersion = new ArrayList(); 

我使用完全限定名称来清楚地显示Hibernate特定和标准JPA注释。

Hibernate特定的CascadeType.DELETE_ORPHAN是其他东西,它用于告诉Hibernate 删除特定的SuiteVersion如果你从集合中删除它 (没有它, SuiteVersion记录将被更新以删除到父Suite的链接但是将保留在桌子,因此是一个“孤儿”)。

请注意,如果您使用的是JPA 2.0(即Hibernate 3.5+),现在有一种处理孤立记录的标准方法,即不使用Hibernate特定的注释。 您可以在OneToMany (和OneToOne )关联中指定orphanRemoval选项。 喜欢这个:

 @OneToMany(mappedBy = "suite", cascade = CascadeType.REMOVE, orphanRemoval = true) private List listSuiteVersion = new ArrayList(); 

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