对于JPA,我在实体类中定义类似Cascade Type和orphanRemoval设置的问题。对我来说,在实体上定义Cascade Type和orphanRemoval是有限制的,因为它假设您始终希望这些设置在所有方案中都相同。
但是,我可以想到许多情况,其中某个应用程序有时可能需要orphanRemoval,而其他时候不希望orphanRemoval用于给定实体。同样,应用程序有时可能需要一个级联类型,有时需要同一个实体的不同级联类型。
我希望实体管理器允许你在进行合并,持久化等时指示cascade类型(或orphanRemoval)应该是什么,但我不认为api支持这一点。
是否可以针对不同的场景使用不同的级联类型或orphanRemoval值?
我发现这个问题JPA programmaticaly define cascading options提出了类似的问题,答案似乎是不可能的,至少是级联类型。我开始认为我不应该对我的任何关系使用级联类型/ orphanRemoval,这意味着在我希望保存/更新子项的情况下,我将不得不手动执行此操作。
答案 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规则(如果有的话)。