beforeDelete()中的服务访问

Rob*_*hne 4 grails grails-orm

我想在我的grails域对象beforeDelete()事件中调用一个服务.不幸的是,当事件被触发时,它总是可重复地崩溃.我建立了一个再现问题的例子.域对象:

class Gallery {

    def myService

    def beforeDelete() {
            // System.out.println(myService); // not even this works, same error!
        System.out.println(myService.say());
    }
}
Run Code Online (Sandbox Code Playgroud)

服务:

class MyService {

    String say() {
        "hello"
    }
}
Run Code Online (Sandbox Code Playgroud)

测试控制器:

class DeleteController {

    def index() {

        Gallery.list().each {
            it.delete()
        }
    }

    def create() {
        def gallery = new Gallery()
        gallery.save()
    }
}
Run Code Online (Sandbox Code Playgroud)

如果我启动应用程序并调用create后跟索引我得到:

Row was updated or deleted by another transaction (or unsaved-value mapping was incorrect): [testbeforedelete.Gallery#1]
Run Code Online (Sandbox Code Playgroud)

我想要完成的是调用我的服务,这比这个例子复杂一点.我无法解释这种行为,我不知道如何应对这种情况.我知道Hibernate事件需要特别小心,但我被卡住了.

Mar*_*rco 5

beforeDelete实际上对您的域类进行了更改.我同意你不会期待这种行为.Hibernate认为你正在修改实例.您可以使用以下代码来解决您的问题

def beforeDelete() {
    Gallery.withNewSession {
        System.out.println(myService.say());
    }
}
Run Code Online (Sandbox Code Playgroud)

  • 我测试了你的代码,它似乎工作.但是对此的解释是什么?调用服务会以某种方式混淆hibernate会话.并且打开一个新会话可以避免这种情况.我想了解这里发生的事情. (3认同)