Hibernate Post Commit Update事件并不总是按预期触发

时间:2016-11-29 10:08:29

标签: hibernate grails listener

在我工作的应用程序中,我们有一个实现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检索数据时似乎会发生。

是否有某种方法可以始终触发提交后更新事件?

0 个答案:

没有答案