刷新后调用Hibernate PostInsertEventListener

刷新后调用Hibernate PostInsertEventListener,hibernate,event-handling,Hibernate,Event Handling,我有一个类实现了HibernatePostInsertEventListener,它通过Spring绑定到HibernateSessionFactory。为插入后事件类型指定了侦听器。每当我执行会话.save(实体)时,就会调用此拦截器。但是,执行发生在刷新事务之前。如果数据库抛出异常,则会出现问题 问题: 在调用了会话.flush()之后,是否有一种方法可以指定调用拦截器 我尝试在事件侦听器中执行insertEvent.getSession().flush(),但这会产生主键冲突异常,因为尚未

我有一个类实现了Hibernate
PostInsertEventListener
,它通过Spring绑定到Hibernate
SessionFactory
。为插入后
事件类型指定了侦听器。每当我执行
会话.save(实体)
时,就会调用此拦截器。但是,执行发生在刷新事务之前。如果数据库抛出异常,则会出现问题

问题: 在调用了
会话.flush()
之后,是否有一种方法可以指定调用拦截器

我尝试在事件侦听器中执行
insertEvent.getSession().flush()
,但这会产生主键冲突异常,因为尚未设置id

我还没有探索
寄存器同步
的方法,因为我似乎缺少一些基本配置。正在使用的事务管理器是org.springframework.orm.hibernate3.HibernateTransactionManager
,事务边界由
@transactional
注释指定。Hibernate版本是3.6

如何使用

当前解决方案:

将Post(插入|更新|删除)事件存储在以会话为键的映射中。从会话的FlushEventListener中的映射中获取事件并处理该事件


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

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

我这样做了,它被调用了,但FlushEvent没有我想要检查的任何属性。我只是想提及它。我必须使用映射将FlushEventListener与Post(插入|更新|删除)侦听器耦合。我不知道你是不是在暗示。谢谢太好了,谢谢你发布这个答案。在尝试解决同一问题数小时后,在任何地方都找不到此信息。真是一种享受!