如何在for循环(Hibernate envers)中进行审计?

时间:2017-09-04 06:33:24

标签: java spring hibernate hibernate-envers

我正在使用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 个答案:

答案 0 :(得分:0)

正如@gtosto指出的那样,Hibernate Envers在事务边界的基础上运行,因此审计记录在提交之前不会被刷新和持久化。

同步这种方法的一种方法是自己手动控制事务边界作为for循环的一部分,这样你基本上可以持久保存列表和提交的小桶。

这里的缺点是性能密集,特别是如果您尝试保留的对象列表非常大。

jira问题HHH-9622概述了使AuditProcess可以冲洗的请求;但是,引入这种需要考虑的行为会产生后果。

答案 1 :(得分:0)

实际上问题是我将@Transactional注释添加到相应的类中。删除它,一旦你调用objRepository.save(a),休眠就会激活审计命令。不需要实体经理。