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

Grails:尝试用嵌套对象保存对象。没有错误,但没有ID,grails,gorm,Grails,Gorm,这是我的应用程序:我有一个由三个元素组成的用户 用户(来自SpringSecurity的用户名、密码、角色等) AppUser(姓氏等基本细节) 详细用户(按应用程序、工作区域等具体说明) AppUser包含User和DetailUser的实例(最后一个实例可为null) 这是我的代码: if (user.validate() && appUser.validate() ){ user.save() appUser.user =

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

  • 用户(来自SpringSecurity的用户名、密码、角色等)
  • AppUser(姓氏等基本细节)
  • 详细用户(按应用程序、工作区域等具体说明)
  • AppUser包含User和DetailUser的实例(最后一个实例可为null)

    这是我的代码:

     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)