在Grails中“从头开始”(在代码而不是从表单中)创建对象时遇到问题。以下是控制器(评估)中方法的代码片段。
def newVol = new Vol(
volType:type,
app: assessmentInstance.app,
assessment:assessmentInstance,
dateFound: assessmentInstance.assDate,
urlParam: url,
volName: "TEST",
volNote: "TEST"
)
newVol.save(validate:false,flush:true, failOnError:true)
结果是这个错误:
Class
org.postgresql.util.PSQLException
Message
ERROR: cannot execute nextval() in a read-only transaction
id被映射到Vol类中的生成器:
static mapping = {
id column:'vol_id'
id generator: 'sequence',params:[sequence:'scan_sequence']
}
我真的不明白如何将保存视为只读事务。我尝试搞乱我的域类上的@transactional设置,首先将readOnly设置为false然后删除@transactional但它没有改变。看起来我应该寻找使用数据库序列的替代方案。你觉得怎么样?
更新 从上面代码所在的控制器中删除了readonly = true,并且工作正常。但是......删除它的副作用是什么?
答案 0 :(得分:2)
问题是为什么要尝试在只读事务中执行写操作?如果你正在进行写操作,那么删除readOnly=true
绝对是正确的做法。
如果您只是在执行阅读,那么不应删除它。原因是让readOnly=true
提高了性能,因为Hibernate不需要对只读事务执行脏检查。