grails 3.3:org.hibernate.TransientObjectException与findOrSaveWhere

时间:2019-05-24 18:13:27

标签: hibernate grails

在bootstrap.goovy中,我们需要创建静态/测试数据库记录(如果尚不存在)(即在先前运行应用程序时创建的记录)

 def admin1 =  Operator.findOrSaveWhere(username: "admin", password: "test", firstName: "admin", lastName: "admin", email: "a@b.com")

这将创建一条不存在的记录,或者将其读取。很好。

当我们想将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可能刚刚创建了运算符,但未刷新到数据库。

通常,如果使用admin1.save(flush:true),它将解决此问题。有没有一种方法可以刷新使用findOrSaveWhere创建的内容?

1 个答案:

答案 0 :(得分:0)

您可以使用findOrCreateWhere

def admin1 =  Operator.findOrCreateWhere( yadda:yadda, tadda:tadda )
if( !admin1.id ) admin.save flush:true
def note1 =  Note.findOrSaveWhere(user: admin1)

另一个选择:

您应将代码放入显式事务Operator.withTransaction{...}的引导程序中,然后原始代码才能工作。