我可以给你我的 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.
我希望它有所帮助。