Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/401.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/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
Java 使用在查找/选择后调用的DescriptorReventAdapter实现JPA预更新_Java_Jpa_Persistence_Eclipselink - Fatal编程技术网

Java 使用在查找/选择后调用的DescriptorReventAdapter实现JPA预更新

Java 使用在查找/选择后调用的DescriptorReventAdapter实现JPA预更新,java,jpa,persistence,eclipselink,Java,Jpa,Persistence,Eclipselink,我已经为JPA(eclipselink)实现了一个DescriptorReventAdapter。它执行简单的时间戳操作。正在调用preUpdate方法,但调用频率太高。它被调用并更新时间戳,即使在查找/选择操作中也是如此 我遇到的问题似乎也发生在不同的JPA框架中 我试图: 检查上的变更集 DescriptorRevent,这始终为空 检查屏幕上的代码 描述符Revent,这始终是6 我还没有找到任何其他标志或属性,上面写着“这个对象真的被更新了” 如何使preUpdate仅在记录确实已更

我已经为JPA(eclipselink)实现了一个DescriptorReventAdapter。它执行简单的时间戳操作。正在调用preUpdate方法,但调用频率太高。它被调用并更新时间戳,即使在查找/选择操作中也是如此

我遇到的问题似乎也发生在不同的JPA框架中

我试图:

  • 检查上的变更集 DescriptorRevent,这始终为空
  • 检查屏幕上的代码 描述符Revent,这始终是6
我还没有找到任何其他标志或属性,上面写着“这个对象真的被更新了”

如何使preUpdate仅在记录确实已更新而不是仅选定时才执行操作?


显然,preUpdate一直在调用。aboutToUpdate是在需要进行更新时调用触发器的更好方法。

以下是我在阅读此问题后提出的解决方案;我还发现DescriptorRevent上的变更集似乎总是空的

但是,我注意到事件具有获取before和after对象的方法:

 Object oldObject = event.getOriginalObject();
 Object newObject = event.getSource();
这将允许您手动比较字段。
使用反射,您可以编写一些代码来比较任何类中的所有字段。

还尝试通过event.getSession()获取UnitOfWork。这会在服务器启动时导致StackOverflower错误。还有preUpdateWithChanges,它仅在需要更新时调用。这是一个有趣的解决方案。如果这两个类实现了equals(),或者实体类扩展了某个公共接口,该接口定义了一个类似于
boolean shouldUpdateTimestamp()的方法,那么反射就没有必要了。