当前位置: 首页 > 知识库问答 >
问题:

JPA+Hibernate-实体关系中的循环-级联策略

封瑞
2023-03-14

注意事项:如果应用程序选择只提供一个级联路径,那么可能会出现抛出TransientObjectException的场景。如果它提供了两个路径,那么这些路径必须使整个周期,例如,可以尝试通过A保存C1。

版本:JPA 2.0、Hibernate core 4.1.7、Hibernate-JPA-2.0-API 1.0.1

共有1个答案

萧英睿
2023-03-14

我可以给你我的2美分,对不起,如果我的回答有点长。

如果您有这种类型的级联冲突,可能是因为您的级联方法或域模型没有很好地定义。我会小心地将级联策略概括为一个整体图,或者一组不相关的元素。

我的建议是,级联策略应该只用于紧密绑定在一起的相同类型的数据集,就像java世界中的类及其(私有)内部类。母类和子类之间的关系也应该是排他的(在UML中称为非共享关联)。

如果您执行web应用程序或任何客户端-服务器应用程序,您的web工作流应该能够在每个请求时保存有限的对象集,而不必保存根元素中的所有内容。我知道我没有直接回答你的问题。让我们回到您的示例:

假设P是一个银行,C1和C2是两个客户,a是一个产品。

我有两个简单的答案:1)每一层都可以单独保存,不需要任何级联。但是它可以在同一事务中完成,如果你想在同一个DAO中完成,也可以不在同一个DAO中完成。

2)P和C“可以”级联。但是A必须保存在不同的工作流中。

这让我想起了Peter Coad关于“领域驱动分析”的章节:http://www.petercoad.com/download/bookpdfs/jmcuch01.pdf

本章解释了如何在不同的原型中分离图中的不同对象。持久性工作流在事务性数据和描述或“事物”之间不应该是相同的。这有助于制定更好的连锁战略:

 The four archetypes of Peter Coad are:
 - Is it a moment or interval? 
 - Is it a role played? 
 - Is it a catalog-entry-like description? 
 - Otherwise, it's a party, place, or thing.
 类似资料:
  • 日安。 我的想法是: > 我需要递归地索引被索引实体的'name'成员+实体父实体的'name'+forther等,这样它们就会进入同一个lucene文档的字段。 然后,我将能够在一个字段上创建一个简单的查询,以检索所有需要的实体。 事实上,我对第1点有意见。@indexeDembedded不适合这里,因为循环关系和空前缀是禁止的(我不希望实体的名称和它们的父母在不同的字段中)。 是否可以以自定义

  • 问题内容: 如何在EJB 3.0实体Bean(JPA)中建立单向关系? 例如,客户了解Order,但是Order没有任何针对客户的方法。使用(@OneToMany或@OneToOne或@ManyToMany) 问候 问题答案: 使用JPA 2.0 建立单向关系的方法如下: 关系型数据库: 顾客: 订购:

  • 在@JoinColumn中的一对多关系中,我从子表中设置name,从父表中设置reference column。但是,当我在上面的person类中用@OneToOne定义相同的单向关系时,我必须从person表而不是从name表中设置@JoinColumn名称。 我的问题是为什么这两个连接条件中的定义名称不同,在一个条件中,我必须将该名称设置为来自同一表的PK列名的名称,而在第二个示例中,我必须设

  • 我只是在学习java ee 6。我的目标是有一个简单的crud应用程序,让我创建编辑列表和删除一个简单的实体,由id,一个名称字符串和一个描述字符串。我使用了eclipse而不是netbeans,使用了JBoss7而不是glass Fish,只是为了查看一些代码http://netbeans.org/kb/docs/web/jsf20-crud.html。嗯....它起作用了。 现在认为我的实体是

  • 问题内容: 我有一对多关系中的两个客户实体和订单实体。对于每个客户,我需要计算关联订单的数量,并按此数量对结果进行排序。在本地postgres查询中,它看起来像这样: 但是我必须使用CriteriaBuilder来执行此操作,因为此查询是使用CriteriaBuilder放入其他条件的较大代码段的一部分。在Hibernate中,我可能会使用Projections,但在JPA中找不到类似的东西。 使

  • 我有一些关于“级联”的问题,在我的项目中,我有类别类,每个类可以是父类或子类。但我在同一个类中定义了哪一个是父母还是孩子。父母和孩子之间存在一对多的关系。这是我的实体类 我的问题是;当我删除子类别时,它的成功并没有问题。如果父类别有子类别,则无法删除父类别。 错误消息; Servlet.service()的servlet[调度Servlet]在上下文中与路径[]抛出异常[请求处理失败;嵌套异常or