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

时间:2011-01-13 04:15:14

标签: jpa annotations glassfish entity ejb

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

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

感谢您的任何意见!

斯文

1 个答案:

答案 0 :(得分:3)

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

JPA没有提供任何标准方法来了解更改内容。因此,您需要自己跟踪更改,或使用JPA提供程序特定的API。

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

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

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