我有一个实体:
@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,然而,他们没有提出任何解决方案。我想知道是否有人有想法如何解决它?
答案 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没有生效。