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是一个产品. 我有两个简单的答案: 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. 我希望它有帮助. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |