【问题标题】:Why calling EntityManager.merge method with @PreUpdate does't return updated entity?为什么使用 @PreUpdate 调用 EntityManager.merge 方法不会返回更新的实体?
【发布时间】:2019-05-24 08:35:04
【问题描述】:

我想更新我的实体。

我正在使用 JPA,并且正在调用 EntityManger.merge 方法。 Entity 使用@PreUpdate 注解进行注解,该注解在 Entity 中设置系统日期。

这是我调用来执行更新的 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”,但事实并非如此。

【问题讨论】:

  • 为什么会这样?不要混淆合并实体(获取具有瞬态或分离实体的持久版本)并将更改刷新到数据库。刷新发生在不同的时刻,例如在事务提交之前。

标签: java jpa entitymanager


【解决方案1】:

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

合并不会触发刷新来执行语句。 如果你想触发监听器,你必须执行 EntityManager.flush()。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-12-14
    • 1970-01-01
    • 2015-11-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多