12

我有一个实体:

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

4

2 回答 2

11

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

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


更新

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

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

于 2013-11-07T18:20:36.173 回答
2

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

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

于 2013-11-07T17:45:26.283 回答