刷新后调用Hibernate PostInsertEventListener

时间:2012-11-29 22:00:47

标签: hibernate event-handling

我有一个实现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

3 个答案:

答案 0 :(得分:3)

目前的解决方案:

将Post(插入|更新|删除)事件存储在Map中,并将会话作为键。从会话的FlushEventListener中的地图获取事件并处理事件。

使用的地图是Guava Cache,过期时间间隔设置为分钟。这将捕获flush()由于SQLException而失败的情况,并且需要从地图中删除该会话的条目。

答案 1 :(得分:1)

如何使用FlushEventListener

答案 2 :(得分:1)

您可以将post-commit-(update|delete|insert)用于侦听器类型。它在提交事务后调用