如何访问实体的先前状态?

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/@PreUpdatePersist/Update 发生之前执行,我需要一个初始状态(与第一次加载时相同的数据)。我在某处读到 PersistenceContext 保存每个实体的初始状态,以防它需要执行回滚,但仍然没有找到访问该状态的实现。 明白了。抱歉没用。 不能在setUserInformation方法中重新加载实体吗? 要创建审计日志,您只需保存最新状态。您实际上并不需要当前状态。当前状态是该实体的最后一个审计日志。在方法 setUserInformation 上,例如只保存对象 id、用户和日期。当前状态之前的状态已经在审计日志中。有意义吗? 仍有一些用例可以从中受益,hibernate 允许在其刷新脏事件docs.jboss.org/hibernate/orm/3.3/reference/en/html/events.html 中访问它我很惊讶地发现 JPA 对此没有任何帮助 【参考方案1】:

Roolback 不会将实体返回到其预更新/预持久状态,它会还原数据库上的任何更改。我认为持久性上下文中没有这样的对象。我认为你应该使用方面。

【讨论】:

以上是关于如何访问实体的先前状态?的主要内容,如果未能解决你的问题,请参考以下文章

用户先前不允许后如何再次请求麦克风访问权限?

如果在 Db 上修改了先前加载的实体,如何将 EF 设置为不让 saveChanges?

是否可以在spring中直接访问db表来验证状态

Nginx如何启用ETag,提高访问速度

访问计算的 VueJS 的先前值

Mongoose 是不是提供对 pre('save') 中属性先前值的访问?