@PreUpdate不适用于Spring Data JPA

我有一个实体:

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

而听众:

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

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

 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年被某人描述过 ,但他们没有提出任何解决方案。 我想知道是否有人有想法如何解决它?

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

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


UPDATE

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

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

你的两个不同的save()的交易设置是什么?

我认为save()/ update()/ merge()/ persist()之间存在一些差异,对于实体的不同状态(瞬态,持久,分离),操作与您的想法和您的不一样注释@PrePersist和@PreUpdate未生效。