Grails - @Transactional,Connection是只读的

时间:2014-08-05 12:00:38

标签: grails connection readonly scaffolding transactional

我使用静态脚手架为我的Test域类创建CRUD方法。使用创建的TestController时,我没有任何问题保存新的Test对象。但是,我想扩展功能并实现相应的TestService类。这样做我现在总是在保存Test对象时遇到错误:Connection is read-only. Queries leading to data modification are not allowed

在这里它开始出现故障。遵循TestService的代码。如果我理解正确,则没有必要使用@Transactional注释与两个savedelete方法,因为它们将直接从类继承该功能。

package test.services

import grails.transaction.Transactional
import test.Test

@Transactional
class TestService {
    @Transactional(readOnly = true)
    def tests() {
        Test.list()
    }

    @Transactional(readOnly = true)
    def count() {
        Test.count()
    }

    @Transactional
    def save(test) {
         test.save()
    }

    @Transactional
    def delete(test) {
        test.delete()
    }
}

以下是在Test中保存TestController对象的代码:

def save(Test test) {
    if (testInstance == null) {
        notFound()
        return
    }

    if (testInstance.hasErrors()) {
        respond testInstance.errors, view:'create'
        return
    }

    testService.save(testInstance)

    request.withFormat {
        form multipartForm {
            flash.message = message(code: 'default.created.message', args: [message(code: 'test.label', default: 'Test'), testInstance.id])
            redirect testInstance
        }
        '*' { respond testInstance, [status: CREATED] }
    }
}

我唯一改变的是指出testService.save(testInstance)的行。在此之前,脚手架过程放置了testInstance.save flush: true

我真的没有看到错误。特别是,使用或多或少相同的配置可以毫无问题地保存另一个域类的对象。

任何帮助将不胜感激!

1 个答案:

答案 0 :(得分:2)

首先确保您使用的是最近的hibernate或hibernate4插件版本。 目前最新的hibernate插件版本是3.6.10.17,而hibernate4插件版本是4.3.5.5。

此问题可能是由Grails 2.3.0中GRAILS-10063添加的只读集成引起的。默认行为由GRAILS-11177修复,并由此提交修复:https://github.com/grails/grails-data-mapping/commit/6447be90

还要确保您在Config.groovy

中缺少这些设置或设置为false
grails.hibernate.pass.readonly = false
grails.hibernate.osiv.readonly = false

(如果缺少这些设置,则无需添加这些设置)

在DataSource.groovy中使用hibernate插件(hibernate3)的readonly集成功能和hibernate配置中的singleSession = false设置才有意义。 Spring的OSIVI for Hibernate 4不支持singleSession = false模式。