当持久化(更新)实体时,您将调用 EntityManager.persist(entity)传递完整实体。可以使用 @PreUpdate 拦截。
在这个拦截器方法中,有没有人有如何识别哪些属性已更改的配方?以某种方式比较旧实体和新实体?甚至更好地实现通用方法,而不是逐个字段地比较每个类。
感谢您的任何意见!
斯文
答案 0 :(得分:3)
首先,persist()用于新对象(插入)不更新。在持久化上下文中更改的任何对象都将自动更新。
JPA没有提供任何标准方法来了解更改内容。因此,您需要自己跟踪更改,或使用JPA提供程序特定的API。
在EclipseLink中,如果使用EclipseLink DescriptorEventListener preUpdate事件而不是JPA事件,则会得到一个附加到DescriptorEvent的ObjectChangeSet,其中包含更改。
JPA中的另一种方法,如果你正在使用编织,就是将你的对象转换为ChangeTracker并调用_persistence_getPropertyChangeListener()然后调用getObjectChangeSet()。
如果您使用的是TopLink Essentials,描述符事件也适用,但更改跟踪未编织。