Java JPA DescriptorReventAdapter变更集始终为空
我试图在我的JPA实体(日志文件,而不是数据库)中包含一个变更跟踪程序,但是我的DescriptorReventAdapter返回的变更集总是空的。我使用的是EclipseLink 2.5.2、ojdbc6和spring orm 4.1.1 调用所有事件(包括preUpdateWithChanges)并将更改推送到数据库。我正在使用entityManager.merge(实体)更新实体 HistoryEventListener.javaJava JPA DescriptorReventAdapter变更集始终为空,java,jpa,eclipselink,spring-orm,Java,Jpa,Eclipselink,Spring Orm,我试图在我的JPA实体(日志文件,而不是数据库)中包含一个变更跟踪程序,但是我的DescriptorReventAdapter返回的变更集总是空的。我使用的是EclipseLink 2.5.2、ojdbc6和spring orm 4.1.1 调用所有事件(包括preUpdateWithChanges)并将更改推送到数据库。我正在使用entityManager.merge(实体)更新实体 HistoryEventListener.java public class HistoryEventList
public class HistoryEventListener extends DescriptorEventAdapter {
@Override
public void preUpdate(DescriptorEvent event) {
ObjectChangeSet changeSet = event.getChangeSet(); // Always null
}
@Override
public void preUpdateWithChanges(DescriptorEvent event) {
ObjectChangeSet changeSet = event.getChangeSet();
...
};
@Override
public void postUpdate(DescriptorEvent event) {
...
}
@Override
public void postMerge(DescriptorEvent event) {
...
}
}
某实体
@Entity
@Table(name = "XXX", schema = "XXX")
@EntityListeners(HistoryEventListener.class)
@Cache(databaseChangeNotificationType = DatabaseChangeNotificationType.NONE, isolation = CacheIsolationType.ISOLATED)
public class XXXX implements Serializable {
// id + fields
}
persistence.xml
<persistence version="2.0"
xmlns="http://java.sun.com/xml/ns/persistence" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_2_0.xsd">
<persistence-unit name="XXXXXX"
transaction-type="RESOURCE_LOCAL">
<provider>org.eclipse.persistence.jpa.PersistenceProvider</provider>
<jta-data-source>jdbc/XXXXX</jta-data-source>
<exclude-unlisted-classes>false</exclude-unlisted-classes>
<properties>
<property name="eclipselink.weaving" value="static" />
<property name="eclipselink.target-database" value="Oracle11" />
</properties>
</persistence-unit>
</persistence>
org.eclipse.persistence.jpa.PersistenceProvider
jdbc/XXXXX
假的
使用UnitOfWork from还将返回空的ObjectChangeSet。来自DescriptorReventAdapter.preUpdate的API文档: 在计算对象的更改之前引发此事件 (加粗是我的补充。) 从DescriptorRevent.changeSet的文档中: 对于合并后事件,可能已生成更改集 postMerge()覆盖会发生什么?读取事件。getQuery()有效。不知道为什么event.getChangeSet()是emtpy,但我就是这样解决的
public void preUpdateWithChanges(DescriptorEvent event) {
if (event.getQuery() instanceof UpdateObjectQuery) {
UpdateObjectQuery query = (UpdateObjectQuery) event.getQuery();
for (ChangeRecord cr : query.getObjectChangeSet().getChanges()) {
String clazz = query.getObject().getClass().getSimpleName();
Object id = query.getObjectChangeSet().getId();
Object newValue = PropertyUtils.getProperty(query.getObject(), cr.getAttribute());
Object oldVal = cr.getOldValue();
}
}
如果删除缓存注释,它是否会像您预期的那样工作?否,相同的结果。没有变更集除了变更集之外,描述符的其余部分是否按预期填充?似乎是这样。查询中填充了UpdateObjectQuery,其中包含更改。我现在正在尝试从那里获取更改。所有覆盖(postMerge、postUpdate、preUpdateWithChanges、preUpdate)返回的所有更改集均为空:(