JPA和Hibernate级联之间的混淆
我正在使用Hibernate 3.6并对代码进行注释(而不是使用Hibernate映射文件)。我遇到了使用与Hibernate的级联类型不兼容的JPA级联选项的已知“问题”(有关更多信息,请参阅此链接) 我希望得到更多关于这个问题的澄清。我有一些特别的问题: 1) 所以@Cascade({CascadeType.SAVE_UPDATE})适用于saveOrUpdate(),但是如果我使用merge()或persist(),它也适用吗?或者我必须使用所有三种Hibernate类型 2) 我如何决定是使用JPA级联选项还是使用Hibernate@cascade注释 2) Hibernate中对此有一个“bug”,但开发人员显然将其视为一个文档问题(我完全不同意他们的观点),并且我没有看到在所述文档中提到过它。有人知道为什么这是“按设计工作”,而不是Hibernate的JPA实现中的错误吗JPA和Hibernate级联之间的混淆,hibernate,jpa,cascade,Hibernate,Jpa,Cascade,我正在使用Hibernate 3.6并对代码进行注释(而不是使用Hibernate映射文件)。我遇到了使用与Hibernate的级联类型不兼容的JPA级联选项的已知“问题”(有关更多信息,请参阅此链接) 我希望得到更多关于这个问题的澄清。我有一些特别的问题: 1) 所以@Cascade({CascadeType.SAVE_UPDATE})适用于saveOrUpdate(),但是如果我使用merge()或persist(),它也适用吗?或者我必须使用所有三种Hibernate类型 2) 我如何决定
非常感谢。来自Hibernate参考文档 对于Hibernate会话的每个基本操作,包括persist()、merge()、saveOrUpdate()、delete()、lock()、refresh()、execute()、replicate()-都有相应的级联样式 如果您看到文档,您将看到每个会话操作的每个级联样式 我如何决定是使用JPA级联选项还是使用Hibernate@cascade注释
在使用普通JPA应用程序时,更喜欢使用普通JPA级联样式。如果使用Hibernate,请选择Hibernate级联样式中记录了此行为
CascadeType.ALL
或根本不需要级联。在这种情况下,JPA注释就足够了,因为JPA的CascadeType.ALL也涵盖了所有Hibernate操作。否则,如果需要细粒度的级联控制(并使用Hibernate的会话
接口),则需要Hibernate的@Cascade
EntityManager
,一切都可以正常工作。只有将JPA注释与Hibernate的会话
接口结合使用时,此问题才会存在1.如果我正确理解Hibernate正在实现JPA,我会期望Hibernate的SAVE_更新级联到JPA的persist()和merge(),但我理解为什么我需要这三个。这让我很恼火——两者都可以,但是如果你不全部使用,Hibernate就不够“聪明”来为你做映射。我在Hibernate文档中也没有看到关于使用@Cascade with Hibernate会话的任何内容(这就是为什么我认为错误报告是有效的)。@Jay:问题是,当通过
EntityManager
访问Hibernate时,Hibernate充当JPA实现,如果通过会话访问Hibernate
,它会自行执行操作,尽管它仍然可以使用JPA注释。仅供参考,手册中根本没有提到CascadeType.SAVE_UPDATE,“delete”适用于delete()方法的XML,但CascadeType.REMOVE适用于delete()方法的注释。手册中也没有提到CascadeType.REFRESH、CascadeType.execute和CascadeType.REPLICATE。