@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:对不起我的英语,我是法国人。答案 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
但这超出了这个问题,因为这实际上不是你想要的。