JPA DescriptorEventAdapter ChangeSet 始终为空
JPA DescriptorEventAdapter ChangeSet always null
我正在尝试将更改跟踪器包括到我的 JPA 实体(到日志文件,而不是数据库),但是我的 DescriptorEventAdapter 返回的 changeSet 始终为空。我正在使用 EclipseLink 2.5.2、ojdbc6、spring-orm 4.1.1.
调用所有事件(包括 preUpdateWithChanges)并将更改推送到数据库。我正在使用 entityManager.merge(entity) 来更新实体。
HistoryEventListener.java
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>
使用 eclipse wiki 中的 UnitOfWork 也 returns 空 ObjectChangeSet。
来自 DescriptorEventAdapter.preUpdate 的 API 文档:
This event is raised before the object's changes are computed....
(粗体是我加的。)
来自 DescriptorEvent.changeSet 的文档:
For the post merge event it is possible that there has been a change set generated.
你的 postMerge() 覆盖发生了什么?
阅读 event.getQuery() 作品。不知道为什么 event.getChangeSet() 是空的,但这就是我解决它的方法。
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();
}
}
我正在尝试将更改跟踪器包括到我的 JPA 实体(到日志文件,而不是数据库),但是我的 DescriptorEventAdapter 返回的 changeSet 始终为空。我正在使用 EclipseLink 2.5.2、ojdbc6、spring-orm 4.1.1.
调用所有事件(包括 preUpdateWithChanges)并将更改推送到数据库。我正在使用 entityManager.merge(entity) 来更新实体。
HistoryEventListener.java
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>
使用 eclipse wiki 中的 UnitOfWork 也 returns 空 ObjectChangeSet。
来自 DescriptorEventAdapter.preUpdate 的 API 文档:
This event is raised before the object's changes are computed....
(粗体是我加的。)
来自 DescriptorEvent.changeSet 的文档:
For the post merge event it is possible that there has been a change set generated.
你的 postMerge() 覆盖发生了什么?
阅读 event.getQuery() 作品。不知道为什么 event.getChangeSet() 是空的,但这就是我解决它的方法。
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();
}
}