Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/jpa/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/api/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Jpa 如何识别@PreUpdate中的EJB实体属性更改?_Jpa_Annotations_Glassfish_Entity_Ejb - Fatal编程技术网

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

Jpa 如何识别@PreUpdate中的EJB实体属性更改?,jpa,annotations,glassfish,entity,ejb,Jpa,Annotations,Glassfish,Entity,Ejb,当持久化(更新)实体时,您将调用EntityManager.persist(entity)传递完整的实体。可以使用@PreUpdate进行拦截 有人知道如何识别在这个拦截器方法中哪些属性发生了变化吗?以某种方式比较新旧实体?更好的做法是实现一个泛型方法,而不是对每个类逐个字段进行比较 谢谢你的意见 Sven首先,persist()用于新对象(插入)而不是更新。在持久性上下文中更改的任何对象都将自动更新 JPA没有提供任何标准的方法来了解发生了什么变化。因此,您需要自己跟踪更改,或者使用JPA提供

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

有人知道如何识别在这个拦截器方法中哪些属性发生了变化吗?以某种方式比较新旧实体?更好的做法是实现一个泛型方法,而不是对每个类逐个字段进行比较

谢谢你的意见

Sven

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

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

在EclipseLink中,如果使用EclipseLink DescriptorReventListener预更新事件而不是JPA事件,则会将ObjectChangeSet附加到包含更改的DescriptorRevent

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


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

相关:有没有类似于Hibernate的方法?