@PreUpdate不适用于Spring Data JPA

时间:2013-11-07 17:25:25

标签: java spring jpa 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

问题已经是described by someone in 2009,然而,他们没有提出任何解决方案。我想知道是否有人有想法如何解决它?

2 个答案:

答案 0 :(得分:7)

正如你所说,如果实体是从DB分离或再次获取的,那么第二次回调方法被称为

我无法准确地解释它,但是可以想到在第二次save()调用之前没有识别脏字段而因此未调用@PreUpdate回调时所描述的情景here。或者它可能只是您的EclipseLink版本中的一个错误。


<强>更新

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

  

请注意,它是否依赖于实现,是否为PreUpdate和   持久化实体时会发生PostUpdate回调   随后在单个交易中或当实体被修改时   在单个交易中修改并随后删除。   便携式应用程序不应该依赖这种行为。

答案 1 :(得分:2)

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

我认为save()/ update()/ merge()/ persist()之间会有一些不同,对于实体的不同状态(transient,persistent,detached),操作与你不一样想法和你的注释@PrePersist和@PreUpdate没有生效。