合并后未调用的分离实体的生命周期回调

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了合并后未调用的分离实体的生命周期回调相关的知识,希望对你有一定的参考价值。

我在我的JPA项目中发现了一个意想不到的行为。

基本上,我的实体在每次更新时都调用了modified()方法,如下所示:

@PrePersist
@PreUpdate
private void callback() {
    modified(); // sets a java.util.time.Instant
}

这是正常的。

在某些时候,我不得不分离实体,做了一些改变,然后将其合并;但是没有调用回调。

这是一个错误,还是文档规范的一部分?

我正在使用EclipseLink,如果重要的话。


编辑:追踪到一个完全不同的问题,这在这个问题上是无关紧要的。

答案

好的,我做了一些测试,这就是我发现的以及我对案例的看法(即时使用JPA 2.1)。

merge()操作唯一可以调用事件侦听器的时间是在尚未持久化的新实体上调用它。然后它作为persist()操作本身,并调用@PrePersist注释类。这是规范中的正确行为:

在执行该实体的相应PrePersist PreRemoveEntityManager操作之前,为给定实体调用persistremove回调方法。对于已应用合并操作并导致创建新托管实例的实体,在将实体状态复制到托管实例后,将为托管实例调用PrePersist回调方法。

现在你正在做的是修改已经存在的实体,唯一可以调用的监听器是@PreUpdate / @PostUpdate。虽然您有以下规格:

请注意,在实体持久化并随后在单个事务中进行修改或者在单个事务中修改实体并随后将其删除时,是否依赖于实现来确定是否发生PreUpdate和PostUpdate回调。便携式应用程序不应该依赖这种行为

在我看来,您正在遵循“实体被修改并随后被删除”的情景。在PersistenceContext中删除了在你的情况下分离的含义,在这种情况下行为是不可预测的。经过一些测试后,我确认在这种情况下不会调用监听器方法。

我找不到任何可以以任何方式强制执行此行为的其他配置。希望有所帮助。

以上是关于合并后未调用的分离实体的生命周期回调的主要内容,如果未能解决你的问题,请参考以下文章

调用 replace() 时片段的生命周期是啥?

Android片段生命周期:onResume调用了两次

在不存在的片段上调用片段生命周期和 onCreate 的问题

在编译阶段注册生命周期回调

关于片段生命周期,何时调用片段的 onActivityResult?

理解片段事务期间片段的生命周期方法调用