在bootstrap.goovy中,我们需要创建静态/测试数据库记录(如果尚不存在)(即在先前运行应用程序时创建的)
def admin1 = Operator.findOrSaveWhere(username: "admin", password: "test", firstName: "admin", lastName: "admin", email: "[email protected]")
如果记录不存在,则会创建记录;如果记录不存在,则会创建记录。大。
当我们想将admin1用作另一个sql语句中的字段时,问题就来了。
def note1 = Note.findOrSaveWhere(user: user1, operator: operator1, note: "This is a note. Pretty dull. User is Boib. you can trust him 1")
失败的原因是:
org.hibernate.TransientObjectException: object references an unsaved transient instance - save the transient instance before flushing: come.me.myapp.Operator
findOrSaveWhere大概是刚刚创建的运算符,但未刷新到DB。
通常,如果使用admin1.save(flush:true),它将解决此问题。有没有一种方法可以刷新使用findOrSaveWhere创建的内容?
最佳答案
您可以使用findOrCreateWhere
:
def admin1 = Operator.findOrCreateWhere( yadda:yadda, tadda:tadda )
if( !admin1.id ) admin.save flush:true
def note1 = Note.findOrSaveWhere(user: admin1)
另外一个选项:
您应该将代码放入显式事务
Operator.withTransaction{...}
的 bootstrap 中,然后原始代码应该可以工作。