代码之家  ›  专栏  ›  技术社区  ›  Luis C.

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

  •  1
  • Luis C.  · 技术社区  · 10 年前

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

    1. 使用者 (用户名、密码、角色等。来自SpringSecurity)
    2. 应用程序用户 (姓氏等基本细节)
    3. 详细信息用户 (具体细节取决于应用、工作区域等)

    AppUser包含User和DetailUser的实例(此lastone可为空)

    这是我的代码:

     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)
    
    2 回复  |  直到 10 年前
        1
  •  1
  •   Ted Delezene    10 年前

    首先,您不会在 .save() 没有 failOnError: true

    user.save(failOnError: true)
    

    它只是悄悄地不保存,也不会真正通知失败(如果你想看到失败,你必须检查它是否包含错误)。

    最后,这个特定的错误出现在大量与保存有关的事件中,这些保存是在创建连接表的地方进行的。

    我所看到的最好的情况是,你要确保父母和孩子都有彼此的链接。所以,你想这样做:

     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 对于给定的错误。通常我使用 g:eachError 标记以向最终用户显示错误,以便他们可以清理提交并重试。

        2
  •  0
  •   Luis C.    10 年前

    最后我找到了解决办法。

    在SO上搜索这个问题,我发现了很多关于这个问题的帖子。有人说:

    <Domain>.get(id)
    

    也许可以关闭会话,因此不会保存对象。 但我在哪里调用.获取函数?!?!?

    在这里:

    def appUser = new AppUser(params)
    

    在内部,我与许多domanin(例如Region Region)有一对一的关系。内部 Grails参数映射 我有 参数。“appUser.region” 区域ID。

    如果我使用grails(spring)的绑定器(我无法检查代码,但如果这是真的,我会在某处找到.get(id)…),我的对象将不会持久化。

    但是,如果我手动绑定,一切正常 ,我的对象已保存。

    推荐文章