我正在尝试获取数据库操作中已删除实体的列表,以实现自定义审核。不幸的是,由于级联删除操作,仅覆盖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
总是返回一个空列表,何时将实体添加到该列表?
答案 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所提示的那样,可能可以直接将其展开。投射后,我可以直接访问已删除对象的列表。