我正在使用hibernate envers进行审计 . 它工作正常但今天我意识到如果我在for循环中创建实体它不会 . 在为sql查询设置log true后,我发现,每次迭代后rev-tables都不会更新 . 以某种方式,hibernate收集所有更改并在请求结束时触发审计命令?如何在for-loop中每次迭代后让hibernate进行审计?
我已经尝试过的:
for (...) {
Obj a = new Obj();
objRepository.save(a);
entityManager.flush();
entityManager.clear();
}
2 回答
正如@gtosto指出的那样,Hibernate Envers在事务边界的基础上运行,因此在提交之前,审计记录不会被刷新和持久化 .
同步这种方法的一种方法是自己手动控制事务边界作为for循环的一部分,这样你基本上可以持久保存列表和提交的小桶 .
这里的缺点是性能密集,特别是如果你试图保持的对象列表非常大 .
jira问题HHH-9622概述了使
AuditProcess
可以冲洗的请求;但是,引入需要考虑的这种行为会产生后果 .实际上问题是我将@Transactional注释添加到相应的类中 . 删除它,一旦调用
objRepository.save(a)
,hibernate将触发审计命令 . 不需要实体经理 .