我正在使用hibernate enver进行审计。它工作得很好,但今天我意识到,如果我在for循环中创建实体,它就不起作用了。在为sql查询设置logtrue之后,我发现rev表在每次迭代之后都不会更新。以某种方式hibernate收集所有更改并在请求结束时触发audit命令?如何让hibernate在for循环的每次迭代之后进行审计?
我已经试过了:
for (...) {
Obj a = new Obj();
objRepository.save(a);
entityManager.flush();
entityManager.clear();
}
2条答案
按热度按时间bvuwiixz1#
事实上,问题是我将@transactional注解添加到了相应的类中。删除它,hibernate将在您调用
objRepository.save(a)
. 不需要实体管理器。uhry853o2#
正如@gtosto所指出的,hibernate envers在事务边界的基础上运行,因此审计记录在提交之前不会被刷新和持久化。
同步的一种方法是将事务边界作为for循环的一部分手动控制,这样基本上就可以持久化列表中的小bucket并提交。
这里的缺点是性能密集型的,特别是当您试图持久化的对象列表非常大时。
jira发行的hhh-9622概述了提出
AuditProcess
可冲洗的;然而,引入这种行为的后果是需要考虑的。