我正在使用Eclipselink并希望为所有插入/更改/删除业务活动编写changlog(实体)。我找到了postCalculateUnitOfWorkChangeSet或SessionEventAdapter的preCommitTransaction,我可以根据变更集构建和插入changelog。 如何在两种方法中获取插入/更新/删除对象的变更集? 如何使用相同的工作单元插入新的更改日志实体,因为我需要它们在同一事务中发生。
我尝试的内容如下:
@Override
public void postCalculateUnitOfWorkChangeSet(SessionEvent event) {
Object source = event.getSource();
if (source instanceof UnitOfWork) {
UnitOfWork unitOfWork = (UnitOfWork) source;
UnitOfWorkChangeSet unitOfWorkChangeSet = unitOfWork.getUnitOfWorkChangeSet();
if (unitOfWorkChangeSet != null && unitOfWorkChangeSet.hasChanges()) {
Map allChangeSets = unitOfWorkChangeSet.getAllChangeSets();
allChangeSets.forEach((k, v) -> {
if (v instanceof ObjectChangeSet) {
ObjectChangeSet ocs = (ObjectChangeSet) v;
if (ocs.isNew()) {
Object unitOfWorkClone = ocs.getUnitOfWorkClone();
if (unitOfWorkClone instanceof Traceable) {
ChangeLog changeLog = getChangeLog(Operation.INSERT, (Traceable) unitOfWorkClone);
unitOfWork.registerNewObject(changeLog);
unitOfWork.getParent().insertObject(changeLog);
}
} else {
List<ChangeRecord> changes = ((ObjectChangeSet) v).getChanges();
changes.forEach(c -> {
Object unitOfWorkClone = ((ObjectChangeSet) (c.getOwner())).getUnitOfWorkClone();
if (unitOfWorkClone instanceof Traceable) {
ChangeLog changeLog = getChangeLog(Operation.UPDATE, (Traceable) unitOfWorkClone);
unitOfWork.getParent().insertObject(changeLog);
}
});
}
}
}
);
}
}
}
这可以工作但是: 1.我不确定获取变更集是否正确,因为我没有找到相关文档。 2.它无法批量写入。当我批量插入业务对象时,业务对象可以批量编写。但是逐个插入更改日志。
我也尝试过历史政策。但它不能与批量写入一起使用。 eclipselink batch write is disabled when use history policy or DescriptorEventAdapter
非常感谢您的任何评论。