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