当前位置: 首页 > 面试题库 >

JPA与Hibernate级联之间的混淆

黎浩然
2023-03-14
问题内容

我正在使用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
CascadeType?

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

2)在Hibernate中有一个针对此问题的“错误”,但是开发人员显然将此视为文档问题((我完全不同意)),并且我没有看到上述文档中已解决该问题。有谁知道为什么这是“按设计工作”而不是Hibernate的JPA实现中的错误?

提前谢谢了。


问题答案:

此行为记录在11.11中。传递持久性。

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

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

  3. 这不是JPA实施中的错误,因为如果您使用JPA,EntityManager一切都会很好。仅当您将JPA批注与Hibernate的Session界面结合使用时,才会存在此问题。



 类似资料:
  • 我使用的是Hibernate的JPA实现。我有一个包含不同类型用户(私有、公共等)的用户表,user_type列指定用户的类型。 我有一个User类,它是一个表示User表的实体。我补充说 在我的用户类上创建了两个类,PrivateUser和PublicUser,它们都用相应的@DiscriminatorValue扩展了用户类。 如果我的解释不清楚,请让我知道。 提前致谢

  • 问题内容: 我正在使用JPA 2.0并hibernate。我有一个用户类和一个组类,如下所示: 然后,我创建一个用户和组,然后将该用户分配给该组。 我要拥有的是删除组时(当然),该组将被删除,并且该组具有的所有用户-组关系将从USER_GROUP连接表中自动删除,但用户本身不会从USER表。 使用上面的代码,当我删除组时,只有GROUP表中的行将被删除,并且用户在USER_GROUP连接表中仍然具

  • 问题内容: 但没人回答我的下一个问题。经典的hibernate方法使用和JPA 实现之间有什么区别?我听说此JPA实现使用并像包装器一样工作,这是真的吗? 问题答案: 确实。 JPA只是一个API,允许您从使用的持久层中进行抽象。Hibernate提供了充当接口的实现,它使用与Hibernate 相同的基础方法。 这个想法是,例如,您可以将实现切换到Eclipse Link,而不必更改任何源代码。

  • 我读过一些相关的问题,但它们和我的问题不完全一样。 我使用的是JPA Hibernate Spring,我想做一些我不确定是否仅通过配置就可以做到的事情。 我的域类具有或多或少复杂的关系。有许多元素与一个元素相关(就像是一棵树,许多元素是一个元素的子元素)。 类似的东西: 这样会得到一张桌子: 当我删除id=1的行时,我希望删除id=2和id=3的行(这可能是递归的,parent_id=2并且pa

  • 我使用此实体表示具有自关系的类别系统,以获取子类别: 问题是当我想删除一个有子类别的类别时。我想删除所有子类别,但Java会删除此异常: 无法删除或更新父行:外键约束失败(,约束外键()引用) 我试图改变一些东西,如孤儿移除=真或级联=CascadeType。删除或尝试将级联放在单独的注释中,但不起作用。 我最后的希望是手动递归删除类别child,但这不是正确的方法。 提前感谢:)

  • 编辑(完全重新制定的方法): 我试图在一个新项目中推广JPA的使用,但我正在努力解决一个据说微不足道的问题:两个表(父表和子表)之间的内部连接。 我只提供必要的信息,其余的都不提供。如果需要,请随时询问更多信息。有两个表LANGUAGE和MESSAGE\u RESOURCE,其中父表是LANGUAGE(主键ID\u LANGUAGE),子表有一个指向父表的外键(也称为ID\u LANGUAGE)。