JPA/EclipseLink:对某些合并操作禁用级联



我使用的是EclipseLink 2.3.3。具有具有大约100个实体的数据模型。我有一个使用注释映射到每个数据库表的Java类。

我有两个用例要实现。一种是,一个新的记录进入系统,达到大约60-75个表。对于这种情况,我希望merge和persistent级联,这样我就可以合并顶级对象,并将其级联到所有相关的实体。

另一个用例是,我需要插入一个单独对象的集合,通常是一堆不同表中的一个。在这种情况下,我不希望级联合并,因为我需要控制插入。如果我启用了级联,合并第一个对象可能会合并其他对象,也可能不会合并,这取决于它们是否相关或如何相关,所以我宁愿显式地合并它们中的每一个。

因此,本质上,我希望级联合并并在一种情况下持续存在,而不是在另一种情况。因此,如果我在映射的类中包括级联注释,我需要有选择地禁用某些操作的级联;或者,如果我关闭映射类中的级联,我希望为某些操作启用级联。

到目前为止,我还没有找到任何方法来选择性地打开或关闭特定操作的级联。有一个CascadePolicy类,但它似乎只用于查询。有动态实体,我想也许我可以用它来做一些事情,比如从现有实体创建一个动态实体,关闭该实体关系上的级联行为,并以某种方式将其用于合并,但我一直无法找到合适的API。

所以我想知道在我忽略的地方是否有更好的答案?感谢提供任何信息。

我不确定您想要什么级别的控制,尤其是在您提到要插入单个对象的情况下。从声音上看,级联合并正是您想要的Entity对象树,在第一种情况下与EntityManager.merge一起使用。对实体调用的merge将检查它是否是新的,并根据需要更新或插入。将关系标记为级联合并将允许查找新对象并插入它们。

不过,在第二种情况下,如果您想处理单独的插入,为什么不排除映射上的级联持久化选项,只对要插入的对象调用EntityManager.persist?Persist则不会级联,因此只会插入您调用em.Persist的实体。关系将仅用于设置foreignkey值,尽管您可能希望将它们留空,并在以后作为较大合并调用的一部分进行设置。双向关系的双方都需要维护,如果另一方存在并且没有合并,则不会存储其关系更改。

如果这不是你想要的,EclipseLink在UnitOfWork上有本机API(EntityManager本质上包装了用于事务工作的UnitOfWork),允许你指定合并策略。请参阅UnitOfWork上的mergeClone、deepMergeClone和shallowMergeClone,它们本质上分别使用CASCADE_ALL_PARTS、CASCADE_PRIVATE_PARTS和NO_CASCADE作为合并策略,而JPA合并使用CASCADE_BY_MAPPING。

最新更新