如何在for循环中审计(hibernate envers)?

67up9zun  于 2021-07-03  发布在  Java
关注(0)|答案(2)|浏览(302)

我正在使用hibernate enver进行审计。它工作得很好,但今天我意识到,如果我在for循环中创建实体,它就不起作用了。在为sql查询设置logtrue之后,我发现rev表在每次迭代之后都不会更新。以某种方式hibernate收集所有更改并在请求结束时触发audit命令?如何让hibernate在for循环的每次迭代之后进行审计?
我已经试过了:

for (...) {

 Obj a = new Obj();
 objRepository.save(a);

 entityManager.flush();
 entityManager.clear();
}
bvuwiixz

bvuwiixz1#

事实上,问题是我将@transactional注解添加到了相应的类中。删除它,hibernate将在您调用 objRepository.save(a) . 不需要实体管理器。

uhry853o

uhry853o2#

正如@gtosto所指出的,hibernate envers在事务边界的基础上运行,因此审计记录在提交之前不会被刷新和持久化。
同步的一种方法是将事务边界作为for循环的一部分手动控制,这样基本上就可以持久化列表中的小bucket并提交。
这里的缺点是性能密集型的,特别是当您试图持久化的对象列表非常大时。
jira发行的hhh-9622概述了提出 AuditProcess 可冲洗的;然而,引入这种行为的后果是需要考虑的。

相关问题