不同用例的不同 CascadeType 值

Posted

技术标签:

【中文标题】不同用例的不同 CascadeType 值【英文标题】:Different CascadeType values for different use cases 【发布时间】:2017-07-29 02:17:13 【问题描述】:

对于 JPA,我在实体类中定义 Cascade Type 和 orphanRemoval 设置时遇到问题。对我来说,在实体上定义 Cascade Type 和 orphanRemoval 是有限制的,因为它假定您总是希望这些设置在所有场景中都相同。

但是,我可以想到很多情况,应用程序有时可能需要 orphanRemoval 而有时不希望给定实体使用 orphanRemoval。类似地,应用程序有时可能需要一种级联类型,而有时需要为同一实体使用不同的级联类型。

我希望实体管理器允许您在进行合并、持久化等操作时指出级联类型(或 orphanRemoval)应该是什么,但我认为 api 不支持这一点。

是否可以针对不同的场景使用不同的级联类型或 orphanRemoval 值?

我发现这个问题JPA programmaticaly define cascading options 提出了一个类似的问题,答案似乎是不可能的,至少对于级联类型是不可能的。我开始认为我不应该将级联类型/orphanRemoval 用于我的任何关系,这意味着在我确实希望保存/更新孩子的情况下,我将不得不手动执行此操作。

【问题讨论】:

我删除了您的第二个问题,因为您应该每个问题坚持一个问题,这使您的问题主要基于意见,这将使其偏离主题。 【参考方案1】:

对我来说,在实体上定义 Cascade Type 和 orphanRemoval 是有局限性的,因为它假定您始终希望这些设置在所有场景中都相同。

我认为这个假设是合理的,因为实体中的级联设置直接与底层数据库中相应外键 (FK) 约束的参照完整性 (RI) 操作相关。如果我们希望这些规则在“数据库”级别(对应于 Hibernate 中的“实体”级别)自动执行,那么数据库通常希望遵循一条规则,例如,

ALTER TABLE Sales.TempSalesReason     
ADD CONSTRAINT FK_TempSales_SalesReason FOREIGN KEY (TempID)     
    REFERENCES Sales.SalesReason (SalesReasonID)     
    ON DELETE CASCADE    
    ON UPDATE CASCADE    
;

如果我们希望在不同的情况下应用不同的 RI 规则,则由我们的应用程序代码通过对子表执行其自己的 UPDATE 或 DELETE 操作或阻止初始数据库操作来强制执行这些规则否则会触发 FK 约束中的 RI 规则(如果有的话)。

【讨论】:

以上是关于不同用例的不同 CascadeType 值的主要内容,如果未能解决你的问题,请参考以下文章

个人测试总结

软件测试--测试用例

unittest单元测试框架中的参数化及每个用例的注释

用例图中三种关系详解(转)

特定用例的自引用核心数据模型

Jmeter接口测试系列之测试用例编写和调用