Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/jpa/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
JPA和Hibernate级联之间的混淆_Hibernate_Jpa_Cascade - Fatal编程技术网

JPA和Hibernate级联之间的混淆

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 3.6并对代码进行注释(而不是使用Hibernate映射文件)。我遇到了使用与Hibernate的级联类型不兼容的JPA级联选项的已知“问题”(有关更多信息,请参阅此链接)

我希望得到更多关于这个问题的澄清。我有一些特别的问题:

1) 所以@Cascade({CascadeType.SAVE_UPDATE})适用于saveOrUpdate(),但是如果我使用merge()或persist(),它也适用吗?或者我必须使用所有三种Hibernate类型

2) 我如何决定是使用JPA级联选项还是使用Hibernate@cascade注释

2) Hibernate中对此有一个“bug”,但开发人员显然将其视为一个文档问题(我完全不同意他们的观点),并且我没有看到在所述文档中提到过它。有人知道为什么这是“按设计工作”,而不是Hibernate的JPA实现中的错误吗


非常感谢。

来自Hibernate参考文档

对于Hibernate会话的每个基本操作,包括persist()、merge()、saveOrUpdate()、delete()、lock()、refresh()、execute()、replicate()-都有相应的级联样式

如果您看到文档,您将看到每个会话操作的每个级联样式

我如何决定是使用JPA级联选项还是使用Hibernate@cascade注释


在使用普通JPA应用程序时,更喜欢使用普通JPA级联样式。如果使用Hibernate,请选择Hibernate级联样式

中记录了此行为

  • Hibernate级联类型对应于单独的操作,因此您需要这三种类型

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

  • 这不是JPA实现中的一个bug,因为如果使用JPA的
    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。