JPA和Hibernate级联之间的混淆

时间:2010-12-27 18:18:06

标签: hibernate jpa cascade

我正在使用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实现中的错误?

非常感谢提前。

2 个答案:

答案 0 :(得分:13)

11.11. Transitive persistence中记录了此行为。

  1. Hibernate级联类型对应于各个操作,因此您需要全部三个。

  2. 在大多数情况下,您需要CascadeType.ALL或根本不需要级联。在那种情况下,JPA注释就足够了,因为JPA的CascadeType.ALL也涵盖了所有Hibernate操作。否则,如果你需要细粒度级联控制(并使用Hibernate的Session接口),你需要Hibernate的@Cascade

  3. 这不是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级联风格