当前位置: 首页 > 知识库问答 >
问题:

@PreUpdate不适用于Spring Data JPA

昝宜
2023-03-14

我有一个实体:

@Entity
@EntityListeners(MyEntityListener.class)
class MyEntity{ ... }

而听众:

class MyEntityListener{
    @PrePersist
    @PreUpdate
    public void doSomething(Object entity){ ... }
}

我正在使用为这个实体(1.4.1)和EclipseLink生成的Spring Data。代码行为如下所示:

MyEntity entity = new Entity();
entity = dao.save(entity); // the doSomething() is called here
// change something it the entity and save it again
dao.save(entity); // the doSomething() is NOT called here, checked with breakpoint

这个问题在2009年已经有人描述过了,但是他们没有提出任何解决方案。不知道有没有人有办法解决?

共有2个答案

韩羽
2023-03-14

您的两个不同的save()的事务设置是什么?

我认为save()/update()/merge()/persist()之间会有一些不同,对于实体的不同状态(瞬时、持久、分离),操作与您想象的不同,您的注释@PrePersist和@PreUpdate没有生效。

贡正诚
2023-03-14

正如您所说的,如果实体被从DB中分离或再次提取,回调方法将被第二次调用。

我无法确切解释它,但可以想到这里描述的场景,在第二次 save() 调用之前没有标识脏字段,因此没有调用@PreUpdate回调。或者它可能只是您的 EclipseLink 版本中的错误。

更新

在JPA 2.0规范中,我发现了以下内容,这正是您的行为(3.5.2实体生命周期回调方法的语义):

请注意,当实体在单个事务中持久保存并随后被修改时,或者当实体在单个事务中被修改并随后被删除时,是否会发生 PreUpdate 和 PostUpdate 回调,这取决于实现。便携式应用程序不应依赖于此类行为。

 类似资料:
  • 问题内容: 嗨,我只是简单地尝试在www.example.com上获取h1标签,该标签显示为“ Example Domain”。该代码适用于http://www.example.com,但不适用于https://www.exmaple.com。我该如何解决这个问题?谢谢 问题答案: PhantomJSDriver不支持(所有)DesiredCapabilities。 你会需要: 记录在这里:htt

  • 所以我使用这种方法写入文件,它在windows上运行完全正常,但在mac上运行时,它会创建文件,但它们是空的。 我知道数据是正确的,因为它打印正确。感谢您的任何帮助,这真的让我绊倒了。

  • 列名称的类型为int[] 上述查询适用于postgresql,但不适用于hsqldb,甚至适用于sql 尝试的hsqldb版本:2.2.9和2.3.0 在hsqldb中工作的sql是从table_name中选择x,unnest(column_name)y(x)x和y不是该表的列。

  • 我能够成功地打电话给邮递员: /mfp/api/az/v1/token和 /mfpadmin/management-apis/2.0/runtimes/mfp/applications 我正在获取从/mfp/api/az/v1/token接收的承载令牌,并将其添加到/mfp/applications的授权标头中。 我收到了来自两者的200个响应,并从每个API中获取了预期的信息。 然后,我选择从P

  • 我一直在使用声纳3.2 同样的配置,当我升级到SonarQube 4.4时 声纳项目属性: 请帮助整理这些例外 问候, KP

  • 我已经看过并尝试了几乎所有关于这个话题的其他帖子,但运气不好。 我使用的是python 3.6,所以我使用的是以下AMI