如何识别@PreUpdate中的EJB实体属性更改?

jav*_*ude 6 entity annotations ejb jpa glassfish

当持久化(更新)实体时,您将调用EntityManager.persist(实体)传递完整实体.可以使用@PreUpdate进行拦截.

有没有人有一个配方如何识别这个拦截器方法中哪些属性已更改?以某种方式比较旧实体和新实体?甚至更好地实现通用方法,而不是逐个字段地比较每个类.

感谢您的任何意见!

斯文

Jam*_*mes 3

首先,persist()是用于新对象(插入)而不是更新。持久性上下文中发生更改的任何对象都将自动更新。

JPA 不提供任何标准方法来了解发生了什么变化。因此,您要么需要自己跟踪更改,要么使用 JPA 提供商特定的 API。

在 EclipseLink 中,如果您使用 EclipseLink DescriptorEventListener preUpdate 事件而不是 JPA 事件,您将获得一个附加到包含更改的 DescriptorEvent 的 ObjectChangeSet。

JPA 中的另一种方法(如果您使用编织)是将对象转换为 ChangeTracker 并调用 _persistence_getPropertyChangeListener(),然后调用 getObjectChangeSet()。

如果您使用的是 TopLink Essentials,描述符事件也适用,但更改跟踪未编织。