以下问题来自于这种设计:由于您始终在根实体P上调用实体管理器操作,因此级联策略应该是如何被持久化/合并的?应该从两条路线到达级联?
注意事项:如果应用程序选择只提供一个级联路径,则可能会出现抛出TransientObjectException的情况.如果它提供了两个路径,那么这些路径必须进行完整的循环,因为可以尝试通过A保存示例C1.
版本:JPA 2.0,Hibernate内核4.1.7,hibernate-jpa-2.0-api 1.0.1
解决方法
如果您有这种级联冲突,可能是因为您的级联方法或域模型定义不明确.我会小心地将一个级联策略推广到一个整体图形,或一组不相关的元素.
我的建议是,级联策略应该仅用于强大地绑定在一起的数据集,并且类似于在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.
我希望它有帮助.