这是我的应用程序:我的用户由三个元素组成
AppUser包含User和DetailUser的实例(此lastone可为空)
这是我的代码:
if (user.validate() && appUser.validate() ){
user.save()
appUser.user = user
appUser.save()
appUserDetail.appUser = appUser
appUserDetail.save()
}
没有错误验证,但我的appUser的ID为null!
真心的我不明白为什么。
更新
Hibernate.AssertionFailure an assertion failure occured (this may indicate a bug in Hibernate, but is more likely due to unsafe use of the session)
org.hibernate.AssertionFailure: null id in it.geny.auth.AppUser entry (don't flush the Session after an exception occurs)
最佳答案
首先,没有.save()
的failOnError: true
不会有任何错误
即
user.save(failOnError: true)
它只会悄悄地不保存,也不会真正通知它失败(如果您想查看失败,则必须检查它是否包含错误)。
最后,在与要在其中创建联接表的保存有关的大量事件中都会出现该特定错误。
我所见过的最好的是,您要确保 parent 和 child 都具有彼此的链接。因此,您想要执行以下操作:
if (user.validate() && appUser.validate() ){
user.appUser = appUser
appUser.user = user
appUserDetail.appUser = appUser
appUser.UserDetail = appUserDetail
appUserDetail.save(failOnError: true)
appUser.save(failOnError: true)
user.save(failOnError: true)
}
我没有测试此代码,您可能需要对它稍加烦恼,但关键是要在保存之前确保每个对象都指向另一个对象。
failOnError可能不是必需的,并且您可能不希望在保存失败的情况下引发异常,在这种情况下,您可以只调用
.save()
,然后检查user.errors
中是否存在给定的错误。通常,我在gsp中使用g:eachError
标记向最终用户显示错误,以便他们清理提交内容并重试。
关于grails - Grails:尝试使用嵌套对象保存对象。没有错误但没有ID,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29218310/