如何在postCalculateUnitOfWorkChangeSet或preCommitTransaction中编写新实体

时间:2016-07-01 10:00:06

标签: eclipselink changelog

我正在使用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

非常感谢您的任何评论。

0 个答案:

没有答案