jpa - 跟踪 JPA 中更改的属性

标签 jpa jakarta-ee properties javabeans audit

目前,我正在开发一个 Java EE 项目,该项目对持久性管理有一些重要的要求。用户对实体的更改首先需要在验证之前应用到某个工作副本,然后再应用到“实时数据”。对实时数据的任何更改也需要对它们进行一些记录,以允许审计。

实体通过 JPA 管理,Hibernate 将用作提供者。这是给定的,所以我们不会回避特定于 Hibernate 的东西。对于第一个要求,使用了两个持久性单元。一个将实体映射到“实时数据”表,另一个映射到“工作副本”表。对于第二个需求,我们将使用 Hibernate Envers,它非常适合我们的用例。

到现在为止还挺好。现在,当用户在(基于 Web 的)前端查看数据时,能够指示与实时数据相比,工作副本中哪些字段发生了更改将非常有用。不同的颜色就足够了。为此,我们需要某种方式来了解哪些属性已被更改。我的问题是,什么是解决这个问题的好方法?

使用 JavaBeans API,PropertyChangeListener可能足以通知工作副本实体中的任何更改并保留一组。但是该集合也需要持久化,因为可以重新启动应用程序,并且更改可以在它们被验证并应用于实时数据之前长期存在。并且每次需要对实时数据进行更改以获取工作副本是不可行的(因此有两个持久性单元)。
我们还可以将工作副本与实时数据进行比较,并找到不同的字段。一些自省(introspection)和反射代码就足够了,但这似乎是处理密集型的,更不用说需要获取实时数据了。
也许我错过了一些简单的东西,或者有人知道我可以使用一个很棒的 JPA/Hibernate 功能。即使在将此类信息应用于实时数据之前,我无法避免创建(a)单独的数据库表来存储此类信息,但这种情况下的一些最佳实践或实际经验可能非常有用。

我意识到这是一个半开放的问题,但肯定其他人一定遇到过这样的要求。任何好的建议都会受到赞赏,任何指向现成解决方案的指针都将是一个很好的候选答案。

最佳答案

也许您可以使用 Hibernate 刷新实体事件监听器。脏属性是在刷新之前计算的。您可以将它们存储在数据库中的某个位置。

一个 sample code使用 Hibernate 的脏属性特性,这可能会给你一个想法。

关于jpa - 跟踪 JPA 中更改的属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35345927/

相关文章:

java - 使用 HibernateTemplate 和 IN 子句进行批量更新

java - 是否为每个方法调用创建一个 EclipseLink EntityManager 或用锁保护?

java - hibernate :级联类型

java - 为什么 Hibernate 检测到类/实体映射重复?

javascript - 使用 Prop 切换导航列表,嵌套数组/对象

javascript - 在调用依赖它的方法时设置 javascript 对象属性

java - 使用 spring + JPA 在乐观锁定中处理 LockModeType

java - Java EE SDK 的问题

jsp - java.lang.IllegalStateException : Response already committed 造成了什么危害

java - 在自定义 validator 中访问父属性路径