Grails:尝试用嵌套对象保存对象。没有错误,但没有ID
这是我的应用程序:我有一个由三个元素组成的用户Grails:尝试用嵌套对象保存对象。没有错误,但没有ID,grails,gorm,Grails,Gorm,这是我的应用程序:我有一个由三个元素组成的用户 用户(来自SpringSecurity的用户名、密码、角色等) AppUser(姓氏等基本细节) 详细用户(按应用程序、工作区域等具体说明) AppUser包含User和DetailUser的实例(最后一个实例可为null) 这是我的代码: if (user.validate() && appUser.validate() ){ user.save() appUser.user =
if (user.validate() && appUser.validate() ){
user.save()
appUser.user = user
appUser.save()
appUserDetail.appUser = appUser
appUserDetail.save()
}
没有错误验证,但我的appUser的ID为空
我真的不明白为什么
更新
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)
首先,如果没有
failOnError:true
i、 e
它只是静静地不保存,也不会真正通知它失败(如果您想看到失败,必须检查它是否包含错误)
最后,该特定错误出现在大量与正在创建联接表的存储相关的事件中
我所看到的最好的情况是,您希望确保父对象和子对象都具有彼此的链接。所以,你想做这样的事情:
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
标记向最终用户显示错误,以便他们可以清理提交内容并重试。最终我找到了解决方案
关于这个问题,我搜索了很多帖子。有人说,
<Domain>.get(id)
在里面,我有一个一对一的关系,许多多马宁(前地区)。在GrailParameterMap中,我有参数。“appUser.region”,带有区域ID
如果我使用grails(spring)的绑定器(我无法检查代码,但如果这是真的,我会在某处找到一个.get(id)),我的对象将不会持久化
但是,如果我手动绑定,一切正常,我的对象被保存。保存的返回值是多少?appUser.errors中有什么?关于更新:您是否使用了gorm/hibernate钩子(在插入、更新之前?)?错误为空,但我在appUser中有许多钩子和瞬态。我查一下这个?为什么你问我是否有这些钩子?因为钩子很有可能会给你这样的奇怪错误我错过了,但我使用了FailOneError:真的
<Domain>.get(id)
def appUser = new AppUser(params)