保存时出现grails错误:无法在只读事务中执行nextval()

时间:2014-06-18 20:45:00

标签: grails

在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,并且工作正常。但是......删除它的副作用是什么?

1 个答案:

答案 0 :(得分:2)

问题是为什么要尝试在只读事务中执行写操作?如果你正在进行写操作,那么删除readOnly=true绝对是正确的做法。

如果您只是在执行阅读,那么不应删除它。原因是让readOnly=true提高了性能,因为Hibernate不需要对只读事务执行脏检查。

相关问题