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

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

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

是否可以在不同情况下使用不同的层叠类型或orphanRemoval值?

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

最佳答案

对我来说,在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规则(如果有)。

08-06 03:48