我有一个实现Hibernate PostInsertEventListener
的类,它通过Spring绑定到Hibernate SessionFactory
。拦截器是为post-insert
事件类型指定的。每当我执行session.save(entity)
时,都会调用此拦截器。但是,执行在刷新事务之前发生。如果数据库抛出异常,则会出现问题。
问题:
有没有一种方法可以指定在调用session.flush()
之后调用拦截器?
我尝试在事件侦听器中执行insertEvent.getSession().flush()
,但由于尚未设置id,因此会产生主键冲突异常。
我尚未探索registerSynchronization
方式,因为我似乎缺少一些基本配置。正在使用的事务管理器是org.springframework.orm.hibernate3.HibernateTransactionManager
,事务边界由@Transactional
注释指定。 Hibernate版本是3.6
答案 0 :(得分:3)
目前的解决方案:
将Post(插入|更新|删除)事件存储在Map中,并将会话作为键。从会话的FlushEventListener中的地图获取事件并处理事件。
使用的地图是Guava Cache,过期时间间隔设置为分钟。这将捕获flush()由于SQLException而失败的情况,并且需要从地图中删除该会话的条目。
答案 1 :(得分:1)
如何使用FlushEventListener?
答案 2 :(得分:1)
您可以将post-commit-(update|delete|insert)
用于侦听器类型。它在提交事务后调用