Java 使用在查找/选择后调用的DescriptorReventAdapter实现JPA预更新
我已经为JPA(eclipselink)实现了一个DescriptorReventAdapter。它执行简单的时间戳操作。正在调用preUpdate方法,但调用频率太高。它被调用并更新时间戳,即使在查找/选择操作中也是如此 我遇到的问题似乎也发生在不同的JPA框架中 我试图:Java 使用在查找/选择后调用的DescriptorReventAdapter实现JPA预更新,java,jpa,persistence,eclipselink,Java,Jpa,Persistence,Eclipselink,我已经为JPA(eclipselink)实现了一个DescriptorReventAdapter。它执行简单的时间戳操作。正在调用preUpdate方法,但调用频率太高。它被调用并更新时间戳,即使在查找/选择操作中也是如此 我遇到的问题似乎也发生在不同的JPA框架中 我试图: 检查上的变更集 DescriptorRevent,这始终为空 检查屏幕上的代码 描述符Revent,这始终是6 我还没有找到任何其他标志或属性,上面写着“这个对象真的被更新了” 如何使preUpdate仅在记录确实已更
- 检查上的变更集 DescriptorRevent,这始终为空
- 检查屏幕上的代码 描述符Revent,这始终是6
显然,preUpdate一直在调用。aboutToUpdate是在需要进行更新时调用触发器的更好方法。以下是我在阅读此问题后提出的解决方案;我还发现DescriptorRevent上的变更集似乎总是空的 但是,我注意到事件具有获取before和after对象的方法:
Object oldObject = event.getOriginalObject();
Object newObject = event.getSource();
这将允许您手动比较字段。
使用反射,您可以编写一些代码来比较任何类中的所有字段。还尝试通过event.getSession()获取UnitOfWork。这会在服务器启动时导致StackOverflower错误。还有preUpdateWithChanges,它仅在需要更新时调用。这是一个有趣的解决方案。如果这两个类实现了equals(),或者实体类扩展了某个公共接口,该接口定义了一个类似于
boolean shouldUpdateTimestamp()的方法,那么反射就没有必要了。