这个问题分为两部分,第一部分是关于清除列表,第二部分是将所有者分配给对象。

我在Grails的模型中两个 Realm 对象之间存在一对多关系。关系看起来像这样...

class Person {

    static hasMany = [authorities: Role, locations: Location]
}

class Location {

    static belongsTo = Person

}

在我的应用程序中,locations上的Person列表被完全刷新,并替换为用户操作上的新列表。而且,我得到了与关联的Location无关的Person对象的列表。我通过检索当前登录的用户来解决将其应用于哪个人的问题,我将其称为activePerson,可以满足我的目的。

我要做的是删除activePerson上的所有现有位置,然后插入所有新位置,并在我进行操作时将它们与activePerson关联。我现在不想保留Person上的许多属性,因此我想避免仅因为子项的位置已更改而保存整个父对象。

我想到了遍历activePerson.locations列表并一一删除它们,然后依靠GORM / Hibernate将查询分批处理并最后刷新。尽管可能有效,但这似乎是蛮力。我期待有一种clearLocations方法或类似的方法,但找不到。

如果我只用一个新列表替换activePerson.locations并调用activePerson.save(flush:true),GORM将处理现有行的删除吗?

其次,我想将新的Location对象放到activePerson上。同样,我可以填充activePerson.locations并保存整个内容,但是如果可以的话,我想避免这种情况。我可以单独保存它们,但是如何在运行时在每个belongsTo对象上设置Location

因此,回顾一下:
  • 如何清除一对多集合的多个末端的列表?
  • 如何将独立对象与父对象关联并分别持久保存它们?

  • 谢谢

    最佳答案

    清除Collection方法对我不起作用:

    activePerson.locations.clear()
    

    只需尝试调用ConcurrentModificationException来避免collect()遍历集合:
    activePerson.locations.collect().each {
        item.removeFromLocations(it)
    }
    

    然后保存实体以执行SQL语句:
    activePerson.save flush:true
    

    链接到文章以了解更多信息:
    http://spring.io/blog/2010/07/02/gorm-gotchas-part-2/

    07-24 09:17