【发布时间】:2019-02-10 11:50:27
【问题描述】:
我正在尝试获取数据库操作中已删除实体的列表,以实现自定义审核。不幸的是,仅仅覆盖EntityManager 的remove 方法是不够的,因为级联删除。
通过使用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 方法时都会执行此代码。它总是返回一个空列表。
为什么getDeletedObjects() 总是返回一个空列表以及实体何时添加到该列表中?
【问题讨论】:
-
尝试在 EntityManager 上调用 flush,然后在展开 UnitOfWork 后调用 getUnitOfWorkChangeSet 或在展开到 RepeatableWriteUnitOfWork 后调用 getCumulativeUOWChangeSet。
-
这也不起作用。
getDeletedObjects()仍然返回一个空列表。
标签: java jpa eclipselink audit-logging