我正在使用Hibernate 3.6并对我的代码进行了注释(与使用hibernate映射文件相比)。我遇到了使用与Hibernate的CascadeType不兼容的JPA级联选项的已知“问题”(请参阅此链接以获取更多信息http://www.mkyong.com/hibernate/cascade-jpa-hibernate-annotation-common-mistake/)。
我希望对这个问题有一点澄清。我有一些特别的问题:
1)所以@Cascade({CascadeType.SAVE_UPDATE})适用于saveOrUpdate(),但如果我使用merge()或persist(),它是否也适用?或者我是否必须使用所有三种Hibernate CascadeTypes?
2)如何决定是使用JPA级联选项还是使用Hibernate @Cascade注释?
2)在Hibernate中存在一个针对此问题的“bug”,但开发人员显然将此视为文档问题,(我完全不同意它们),而且我没有看到它在文档。任何人都知道为什么这是“按设计工作”而不是Hibernate的JPA实现中的错误?
非常感谢提前。
答案 0 :(得分:13)
11.11. Transitive persistence中记录了此行为。
Hibernate级联类型对应于各个操作,因此您需要全部三个。
在大多数情况下,您需要CascadeType.ALL
或根本不需要级联。在那种情况下,JPA注释就足够了,因为JPA的CascadeType.ALL
也涵盖了所有Hibernate操作。否则,如果你需要细粒度级联控制(并使用Hibernate的Session
接口),你需要Hibernate的@Cascade
。
这不是JPA实现中的错误,因为如果你使用JPA的EntityManager
一切正常。只有将JPA注释与Hibernate的Session
接口结合使用时,才会出现此问题。
答案 1 :(得分:1)
来自Hibernate参考文档
对于Hibernate会话的每个基本操作 - 包括persist(),merge(),saveOrUpdate(),delete(),lock(),refresh(),evict(),replicate() - 有相应的级联风格
如果您看到CascadeType文档,您将看到每个会话操作的每个级联样式
如何决定是使用JPA级联选项还是使用Hibernate @Cascade注释?
在使用普通的JPA应用程序时,更喜欢使用普通的JPA级联样式。如果使用Hibernate,则更喜欢Hibernate级联风格