Grails GORM实例在更新问题时自动持久化到数据库

Grails GORM实例在更新问题时自动持久化到数据库,grails,gorm,Grails,Gorm,我在controller中有一个自定义验证,因为我需要使用数据库进行验证 def update(Object instance) { if (instance == null) { notFound() return } if (instance.hasErrors()) { //redirect code here return } def obj = objService.someM

我在controller中有一个自定义验证,因为我需要使用数据库进行验证

def update(Object instance) {

    if (instance == null) {
        notFound()
        return
    }

    if (instance.hasErrors()) {
        //redirect code here
        return
    }

    def obj = objService.someMethod()

    //some validation code here
    if(someCheck){
        // if i discard it wont work
        instance.discard()
        flash.error = message(code: 'message.code')
        //render code here
        return
    }

在上面的代码中,执行数据库访问后,即使是
实例.discard()
也不起作用。即使没有save方法调用,更改的数据也会自动保存。如果没有执行数据库访问,则相同的
实例.discard()
将起作用。当验证失败时,如何放弃要保留到数据库中的更改值。

更新操作上方添加注释
@Transactional(readonly=true)
。这应该能奏效

这是Grails的内置特性,它自动将实例持久化到数据库中

请阅读我的答案,了解更多细节

更新
操作上方添加注释
@Transactional(readonly=true)
。这应该能奏效

这是Grails的内置特性,它自动将实例持久化到数据库中

请阅读我的答案,了解更多细节

在调用save之前进行检查?看起来很合乎逻辑……这是实例更新案例,正如您看到的,如果验证在somecheck中失败,那么流将从那里返回,save()语句将永远不会执行。因为它在持久化上下文中,所以所有更改的值都会持久化,这很明显,但是在我访问数据库之后,discard()方法就不起作用了。在调用save之前进行检查吗?看起来很合乎逻辑……这是实例更新案例,正如您看到的,如果验证在somecheck中失败,那么流将从那里返回,save()语句将永远不会执行。因为它在持久化上下文中,所以所有更改的值都会持久化,这很明显,但是在我访问一些数据库之后,discard()方法就不起作用了。