【问题标题】:How to identify EJB entity property changes in @PreUpdate?如何识别@PreUpdate 中的 EJB 实体属性更改?
【发布时间】:2011-06-08 06:46:54
【问题描述】:

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

有没有人知道如何在这个拦截器方法中识别哪些属性发生了变化?以某种方式比较旧实体和新实体?最好实现一个通用方法,而不是逐个字段地比较每个类。

感谢您的任何意见!

斯文

【问题讨论】:

标签: jpa annotations glassfish entity ejb


【解决方案1】:

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

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

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

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

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

【讨论】:

  • 有没有办法用 Hibernate 做类似的事情?
猜你喜欢
  • 1970-01-01
  • 2018-10-01
  • 1970-01-01
  • 2012-10-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多