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

时间:2010-08-13 07:51:59

标签: java hibernate orm persistence one-to-many

@OneToMany和@ManyToOne注释存在问题。

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

Class Suite:

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

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:23504   13août201009:40:50 org.hibernate.util.JDBCExceptionReporter logExceptions   GRAVE:完整性约束违规:外键无动作; FK42895651EA304E6表:SUITE_VERSION

提前感谢您的帮助。

最诚挚的问候,

Florent的,

P.S:对不起我的英语,我是法国人。

1 个答案:

答案 0 :(得分:2)

  

但是当我删除与SuiteVersion相关联的套件时,我遇到了一些问题。 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如果将其从集合中移除(没有它,{ {1}}记录将被更新以删除指向父SuiteVersion的链接,但会保留在表中,因此是“孤儿”。)

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

OneToOne

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