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

When are deleted entities written to the eclipselink UnitOfWorkChangeSet?

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

我能够利用 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 方法时都会执行此代码。它总是 return 是一个空列表。

为什么 getDeletedObjects() 总是 return 一个空列表以及何时将实体添加到此列表?

管理总结

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。在以后的版本中,可能会直接解包到此 class,如 Chris 所暗示的那样。转换后,我可以直接访问已删除对象的列表。