2017-07-29 65 views
1

对于JPA,我在实体类中定义诸如级联类型和orphanRemoval设置之类的问题时遇到问题。对我而言,在实体上定义Cascade Type和orphanRemoval是有限制的,因为它假设您始终希望这些设置在所有场景中都相同。针对不同用例的不同CascadeType值

但是,我可以想到很多情况下,应用程序有时可能需要orphanRemoval,而其他时间不需要给定实体的orphanRemoval。同样,应用程序有时可能需要一个级联类型,并且在其他时间需要不同的级联类型用于同一个实体。

我希望实体管理器可以让你在做合并,坚持等等时指出级联类型(orphanRemoval)应该是什么,但我不认为api支持这一点。

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

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

+0

我已经删除了你的第二个问题,因为你应该坚持每个问题一个问题,它使你的问题主要是基于观点的,这将使它脱离主题。 –

回答

0

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