java – JPA Hibernate – 实体关系中的循环 – 级联策略

前端之家收集整理的这篇文章主要介绍了java – JPA Hibernate – 实体关系中的循环 – 级联策略前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我有一组彼此连接的实体形成一个周期,即父实体P与两个子实体C1和C2具有两个一对多的关系,并且每一个与另一实体具有一对多的关系A.实体A实现这些实体(C1,C2)的关联,并定义关系的属性(不仅仅是连接表).所有关系都可以在两个方向通航.

以下问题来自于这种设计:由于您始终在根实体P上调用实体管理器操作,因此级联策略应该是如何被持久化/合并的?应该从两条路线到达级联?

注意事项:如果应用程序选择只提供一个级联路径,则可能会出现抛出TransientObjectException的情况.如果它提供了两个路径,那么这些路径必须进行完整的循环,因为可以尝试通过A保存示例C1.

版本:JPA 2.0,Hibernate内核4.1.7,hibernate-jpa-2.0-api 1.0.1

解决方法

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

如果您有这种级联冲突,可能是因为您的级联方法或域模型定义不明确.我会小心地将一个级联策略推广到一个整体图形,或一组不相关的元素.

我的建议是,级联策略应该仅用于强大地绑定在一起的数据集,并且类似于在java世界中的类和其(私有)内部类的相同类型.母亲阶级与子女之间的关系也应该是排他性的(在UML中,它被称为非共享协会).

当然,你可以做其他事情(我们都可以懒惰),但是最终你可以创建一个单一的持久性流(或持久性配置)和你的业务流之间的耦合网络.您将不得不管理大量的异常,并在您先前放置的级联策略(保存,更新,删除)中执行大量配置逻辑.

极端的做法是有些人可能想要只保存一个大的根对象.为什么不?其余的“应该坚持下去”.但事实上,这可能会严重限制系统的可维护性.此外,在加载,保存和合并时,您可能需要管理内存中的大图形状态.

如果您执行Web应用程序或任何客户端 – 服务器应用程序,则Web工作流程应能够在每个请求中保存有限的一组对象,而无需从根元素中保存所有内容.我知道我没有直接回复你的问题.所以让我们回到你的例子:

说P是一个银行,C1和C2是两个客户,A是一个产品.

我有两个简单的答案:
1)每层可以单独保存,无需任何级联.但是它可以在同一个事务中完成,如果你想要的话也可以在同一个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.

我希望它有帮助.

猜你在找的Java相关文章