为什么用@PreUpdate调用EntityManager.merge方法不返回更新的实体?

时间:2019-05-24 08:35:05

标签: java jpa entitymanager

我想更新我的实体。

我正在使用JPA,并且正在调用EntityManger.merge方法。 该实体带有@PreUpdate注释,该注释在该实体中设置系统日期。

这是我调用的DAO执行更新的方法:

@PersistenceContext(unitName = "myPersistentUnit")
protected EntityManager em;

@Override
public T update(T entity) throws MyException {
    try {
        return em.merge(entity);
    } catch (Exception e) {
        throw new MyException(e);
    }
}

这是我要更新的实体:

@Entity
@Table(name = MyEntity.TABLE_NAME)
public class MyEntity {

    public static final String TABLE_NAME = "MY_TABLE_NAME";

        // other properties

    @Column(name = "TIMESTAMP_LAST_UPDATE", nullable = true)
    @Temporal(TemporalType.TIMESTAMP)
    private Date timestampLastUpdate;

    @PreUpdate
    public void preUpdate() {
        this.setTimestampLastUpdate(new Date());
    }

        // getters and setters

}   

我希望DAO的方法

return em.merge(entity)

返回具有更新属性“ timestampLastUpdate”的更新实体,但事实并非如此。

1 个答案:

答案 0 :(得分:0)

在将SQL语句发送到数据库之前或之后执行回调。

合并不会触发刷新来执行语句。 如果要触发侦听器,则必须执行EntitiyManager.flush()。