grails - Grails:尝试使用嵌套对象保存对象。没有错误但没有ID

标签 grails gorm

这是我的应用程序:我的用户由三个元素组成

  • 用户(用户名,密码,角色等。来自SpringSecurity)
  • AppUser (基本详细信息,例如姓氏等)
  • 详细信息用户(具体细节取决于应用程序,工作区等)

  • 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/

    相关文章:

    maven - 如何配置 grails 2.4.0 以通过身份验证解析来自 JFrog Artifactory 的 Artifact ?

    grails - 以编程方式呈现 GSP

    grails - Grails findById(null)返回 “random”结果

    grails - 如何使用GORM以DRYish方式抽象出数据源选择

    grails - grails版本发布日期

    grails - grails3.1.x 最好的 gitignore 应该是什么?

    java - 多对多关系

    mongodb - 如何使用GORM/MongoDB插件在Grails中的域对象中创建一个上限集合

    grails - grails,hasMany,set和重复项

    grails - 属性上的Grails 3.3 GORM CriteriaBuilder函数