在我工作的应用程序中,我们有一个实现PostInsertEventListener,PostUpdateEventListener和PostDeleteEventListener的侦听器。然后使用doWithApplicationContext中的以下代码将此侦听器附加到这些事件POST_COMMIT_INSERT,POST_COMMIT_UPDATE,POST_COMMIT_DELETE:
def sessionFactory = applicationContext.sessionFactory
def serviceRegistry = sessionFactory.getServiceRegistry()
EventListenerRegistry registry = serviceRegistry.getService(EventListenerRegistry.class);
def listener = (SearchPersistenceListener)applicationContext.getBean("searchPersistenceListener")
def groupUpdate = registry.getEventListenerGroup(EventType.POST_COMMIT_UPDATE)
groupUpdate.prependListener((PostUpdateEventListener) listener)
def groupInsert = registry.getEventListenerGroup(EventType.POST_COMMIT_INSERT)
groupInsert.prependListener((PostInsertEventListener) listener)
def groupDelete = registry.getEventListenerGroup(EventType.POST_COMMIT_DELETE)
groupDelete.prependListener((PostDeleteEventListener) listener)
我们正在从grails 2升级到grails 3,并且在升级期间不再总是调用更新侦听器,例如,如果我在控制器中运行下面的代码,则侦听器不会通过调用:
def object = Candidate.get(1)
if (object.lastName == "AAAAA")
object.lastName = "ccccc"
else
object.lastName = "AAAAA"
object.save(flush: true)
如果我在代码块周围添加Candidate.wthTransaction {},那么它将会工作,但是很难通过所有现有代码来更改它。
如果侦听器附加到POST_UPDATE事件而不是总是被触发,那么这是另一个选项,但是使用现有侦听器代码会导致并发修改错误,这些错误在使用createCriteria检索数据时似乎会发生。
是否有某种方法可以始终触发提交后更新事件?