【发布时间】:2011-06-08 06:46:54
【问题描述】:
在持久化(更新)实体时,您可以调用 EntityManager.persist(entity) 传递完整的实体。可以使用 @PreUpdate 进行拦截。
有没有人知道如何在这个拦截器方法中识别哪些属性发生了变化?以某种方式比较旧实体和新实体?最好实现一个通用方法,而不是逐个字段地比较每个类。
感谢您的任何意见!
斯文
【问题讨论】:
标签: jpa annotations glassfish entity ejb
在持久化(更新)实体时,您可以调用 EntityManager.persist(entity) 传递完整的实体。可以使用 @PreUpdate 进行拦截。
有没有人知道如何在这个拦截器方法中识别哪些属性发生了变化?以某种方式比较旧实体和新实体?最好实现一个通用方法,而不是逐个字段地比较每个类。
感谢您的任何意见!
斯文
【问题讨论】:
标签: jpa annotations glassfish entity ejb
首先,persist() 用于不更新的新对象(插入)。在持久化上下文中更改的任何对象都将自动更新。
JPA 不提供任何标准方法来了解发生了什么变化。因此,您要么需要自己跟踪更改,要么使用 JPA 提供者特定的 API。
在 EclipseLink 中,如果您使用 EclipseLink DescriptorEventListener preUpdate 事件而不是 JPA 事件,您将获得一个附加到包含更改的 DescriptorEvent 的 ObjectChangeSet。
如果您使用编织,JPA 中的另一种方法是将您的对象转换为 ChangeTracker 并调用 _persistence_getPropertyChangeListener() 然后 getObjectChangeSet()。
如果您使用 TopLink Essentials,描述符事件也适用,但未编织更改跟踪。
【讨论】: