在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 中,然后原始代码应该可以工作。

10-05 21:11