【发布时间】:2012-01-21 16:49:32
【问题描述】:
我正在尝试检测 Entity 中的更改,以便检测对实体所做的更改,以便我可以记录为任何用户所做的更改。
到目前为止,我已经设法使用:
@EntityListeners(AuditListener.class)
@Entity
public class Entity1{...}
和,
public class AuditListener {
@PostPersist
@PostUpdate
public void setUserInformation(Object entity) {...}
}
现在,我想要的是一种读取实体的先前状态的方法,以便我可以将其与当前值进行比较,并将字段、新值写入审计表以及执行修改的用户。
我知道我可以使用 @PostLoad 并将以前的状态保存在内存中,但我认为必须有更通用的方法来完成相同的操作(更少的硬编码)。
提前致谢。
【问题讨论】:
-
你好@MДΓΓБДLL,因为
@PrePersist/@PreUpdate在Persist/Update发生之前执行,我需要一个初始状态(与第一次加载时相同的数据)。我在某处读到 PersistenceContext 保存每个实体的初始状态,以防它需要执行回滚,但仍然没有找到访问该状态的实现。 -
明白了。抱歉没用。
-
不能在setUserInformation方法中重新加载实体吗?
-
要创建审计日志,您只需保存最新状态。您实际上并不需要当前状态。当前状态是该实体的最后一个审计日志。在方法 setUserInformation 上,例如只保存对象 id、用户和日期。当前状态之前的状态已经在审计日志中。有意义吗?
-
仍有一些用例可以从中受益,hibernate 允许在其刷新脏事件docs.jboss.org/hibernate/orm/3.3/reference/en/html/events.html 中访问它我很惊讶地发现 JPA 对此没有任何帮助