我使用静态脚手架为我的Test
域类创建CRUD方法。使用创建的TestController
时,我没有任何问题保存新的Test
对象。但是,我想扩展功能并实现相应的TestService
类。这样做我现在总是在保存Test
对象时遇到错误:Connection is read-only. Queries leading to data modification are not allowed
在这里它开始出现故障。遵循TestService
的代码。如果我理解正确,则没有必要使用@Transactional
注释与两个save
和delete
方法,因为它们将直接从类继承该功能。
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
我真的没有看到错误。特别是,使用或多或少相同的配置可以毫无问题地保存另一个域类的对象。
任何帮助将不胜感激!
答案 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
中缺少这些设置或设置为falsegrails.hibernate.pass.readonly = false
grails.hibernate.osiv.readonly = false
(如果缺少这些设置,则无需添加这些设置)
在DataSource.groovy中使用hibernate插件(hibernate3)的readonly集成功能和hibernate配置中的singleSession = false设置才有意义。 Spring的OSIVI for Hibernate 4不支持singleSession = false模式。