删除的实体何时写入 eclipselink UnitOfWorkChangeSet?
When are deleted entities written to the eclipselink UnitOfWorkChangeSet?
我正在尝试获取数据库操作中已删除实体的列表,以实施自定义审计。不幸的是,由于级联删除,仅覆盖 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
方法时都会执行此代码。它总是 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 所暗示的那样。转换后,我可以直接访问已删除对象的列表。
我正在尝试获取数据库操作中已删除实体的列表,以实施自定义审计。不幸的是,由于级联删除,仅覆盖 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
方法时都会执行此代码。它总是 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 所暗示的那样。转换后,我可以直接访问已删除对象的列表。