【发布时间】:2012-12-12 08:01:34
【问题描述】:
是否可以在每次刷新到数据库之前更新某些列?我有modifiedOn 和modifiedBy 列,并希望在每次数据库更新时更新它们,类似于数据库触发器。 JPA可以吗?
【问题讨论】:
标签: java jpa triggers entitylisteners
是否可以在每次刷新到数据库之前更新某些列?我有modifiedOn 和modifiedBy 列,并希望在每次数据库更新时更新它们,类似于数据库触发器。 JPA可以吗?
【问题讨论】:
标签: java jpa triggers entitylisteners
免责声明:以下内容仅适用于 Hibernate / JPA。
您可以像这样使用 JPA 更新 modifiedOn 属性:
public class Entity {
private Date modifiedOn;
@PreUpdate
@PrePersist
public void updateModified() {
modifiedOn = new Date();
}
}
至于modifiedBy,它有点棘手,因为 JPA 规范不鼓励在生命周期回调方法中引用其他实体。此外,您还需要了解当前用户,这可能属于服务层。
您可以像这样使用EntityListener(但是,这仍然使用回调方法)
@Entity
@EntityListeners({MyListener.class})
public class MyEntity {
Date modifiedOn;
User modifiedBy;
...
}
EntityListener 中的一个:
public class MyListener {
CurrentUserProvider provider; // Implement this and make sure it is set
@PreUpdate
@PrePersist
public void updateModifier(MyEntity entity) {
entity.setModifiedOn(new Date());
entity.setModifiedBy(provider.getCurrentUser());
}
}
【讨论】:
显然 JPA 在规范中定义了实体回调,例如 @PrePersist、@PreUpdate。对规范的简单修订将为您提供更多详细信息
【讨论】: