4

我有一个实现 Hibernate 的类,它通过 SpringPostInsertEventListener与 Hibernate 相关联。SessionFactory拦截器是为post-insert事件类型指定的。每当我执行session.save(entity). 但是,执行发生在事务被刷新之前。如果数据库抛出异常,这是有问题的。

问题:有没有一种方法可以指定在 调用拦截器session.flush()调用拦截器?

我尝试insertEvent.getSession().flush()在事件侦听器中执行此操作,但由于尚未设置 id,因此会产生主键违规异常。

我还没有探索这registerSynchronization条路,因为我似乎缺少一些基本配置。正在使用的事务管理器org.springframework.orm.hibernate3.HibernateTransactionManager和事务边界由@Transactional注释指定。休眠版本是 3.6

4

3 回答 3

3

当前解决方案:

将 Post(Insert|Update|Delete)Event 存储在以 Session 为键的 Map 中。从 Session 的 FlushEventListener 中的映射中获取事件并处理该事件。

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

于 2012-12-06T00:58:39.507 回答
2

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

于 2017-02-18T10:52:18.683 回答
1

使用FlushEventListener怎么样?

于 2012-11-29T22:07:05.593 回答