如何访问实体的先前状态?
Posted
技术标签:
【中文标题】如何访问实体的先前状态?【英文标题】:How to access previous state of Entity? 【发布时间】: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 对此没有任何帮助
【参考方案1】:
Roolback 不会将实体返回到其预更新/预持久状态,它会还原数据库上的任何更改。我认为持久性上下文中没有这样的对象。我认为你应该使用方面。
【讨论】:
以上是关于如何访问实体的先前状态?的主要内容,如果未能解决你的问题,请参考以下文章