我有一些hibernate代码执行插入数据库,并在完成该插入后触发自定义的PostInsertEventListener。 (基本上是确保其他记录得到适当更新的触发器)
我需要做的是使EventListener中的代码使用与原始插入相同的事务,这样如果插入未成功提交,则不会触发EventListener。
我听说您可以使用javax.transaction.Syncronization
和Hibernate的transaction.registerSyncronization()
方法来执行此操作,但我找不到任何可以使用的示例。
感谢任何帮助。
答案 0 :(得分:3)
我不认为这是可能的。
如果我理解,你只想在事务成功完成(被提交)时执行一些代码。但是,如果事务被提交,则在结束时不能在同一事务中执行其他操作。
然而,您可以使用在事务中(在提交之前)调用的PreInsertEventListener。如果事务失败,事件侦听器将触发事件(因为如果事务成功,我们直到提交才知道),但是如果事务失败,则在侦听器中修改的任何内容都不会存储在数据库中。检查https://www.hibernate.org/hib_docs/v3/api/org/hibernate/event/EventListeners.html以获取侦听器列表。
虽然有一个警告。您不应该在侦听器中进行太多的数据修改。特别是,您不应该触发任何延迟加载的集合。