何时将删除的实体写入eclipselink UnitOfWorkChangeSet?

时间:2018-09-05 10:50:44

标签: java jpa eclipselink audit-logging

我正在尝试获取数据库操作中已删除实体的列表,以实现自定义审核。不幸的是,由于级联删除操作,仅覆盖remove的{​​{1}}方法是不够的。

我能够利用EntityManager及其EntityManager找到新的和更新的实体。奇怪的是,已删除实体的列表始终为空。

我怀疑客户端调用该方法的方式存在问题,但还不确定。客户端通过以下方法从实体的实体集合中删除项目:在对象上删除它们,然后使用持有集合的实体调用UnitOfWorkChangeSet方法。这种方法的作用是利用级联机制从数据库中删除对象,但是我无法在已删除对象的列表中找到已删除的实体。

访问变更集中的已删除实体:

persist

每次调用Map<ObjectChangeSet, ObjectChangeSet> deletedObjects = entityManager.unwrap(UnitOfWork.class) .getCurrentChanges() // returns always an empty list .getDeletedObjects(); return deletedObjects.values().stream() .map(v -> v.getUnitOfWorkClone()) .collect(Collectors.toList()); 方法时,都会执行此代码。它总是返回一个空列表。

为什么persist总是返回一个空列表,何时将实体添加到该列表?

1 个答案:

答案 0 :(得分:0)

管理摘要

entityManager.getTransaction().begin();
entityManager.delete(entity);
final Map deletedObjects = 
    ((RepeatableWriteUnitOfWork) entityManager
        .unwrap(UnitOfWork.class)).getDeleted();
// process deleted objects
entityManager.getTransaction().commit();

说明

免责声明:我绑定到一个古老版本的eclipse-link(2.0.2),因此该解决方案可能已过时。

我的第一个错误是,尝试获取事务外部的已删除对象。尽管此方法适用于新对象和修改后的对象,但不适用于删除的对象。

我的第二个错误是试图访问currentChanges。在调试时,我发现方法getCurrentChanges()是在具有删除的对象的正确更改集上执行的,但是在没有它们的情况下会产生一个更改集。因此,必须将解包的UnitOfWork转换为RepeatableWriteUnitOfWork。在更高版本中,如Chris所提示的那样,可能可以直接将其展开。投射后,我可以直接访问已删除对象的列表。