不同用例的不同CascadeType值

时间:2017-07-29 02:17:13

标签: java hibernate jpa jdbc

对于JPA,我在实体类中定义类似Cascade Type和orphanRemoval设置的问题。对我来说,在实体上定义Cascade Type和orphanRemoval是有限制的,因为它假设您始终希望这些设置在所有方案中都相同。

但是,我可以想到许多情况,其中某个应用程序有时可能需要orphanRemoval,而其他时候不希望orphanRemoval用于给定实体。同样,应用程序有时可能需要一个级联类型,有时需要同一个实体的不同级联类型。

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

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

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

1 个答案:

答案 0 :(得分:0)

  

对我来说,在Entity上定义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规则(如果有的话)。