grails - 如何清除和替换 Grails/Groovy 中一对多关系中的集合

标签 grails grails-orm

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

我在 Grails 模型中的两个域对象之间存在一对多关系。关系是这样的……

class Person {

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

class Location {

    static belongsTo = Person

}

在我的应用程序中 locations列表于 Person完全刷新并替换为用户操作的新列表。更重要的是我得到了 Location 的列表独立于相关联的对象 Person .我通过检索当前登录的用户(我称之为 activePerson)来确定将它们应用到哪个人。对我的目的来说很好。

我想要做的是删除 activePerson 上的所有现有位置并插入所有新的,将它们与 activePerson 相关联我走的时候。我在 Person 上有一堆属性我不想在这一点上坚持下去,所以我想避免仅仅因为 child 的位置发生了变化而保存整个父对象。

我想到了遍历 activePerson.locations将它们一一列出并删除,并依靠 GORM/Hibernate 将查询批处理在一起并在最后刷新。这看起来像是蛮力,尽管它可能会奏效。我原以为会有 clearLocations方法或类似的东西,但我找不到。

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

其次我想放新的Location对象到 activePerson .我再次可以填充 activePerson.locations并保存整个事情,但如果可以的话,我想避免这种情况。我可以单独保存它们,但是如何设置 belongsTo在每个 Location反对我走?

所以回顾一下:
  • 如何清除一对多集合多端的列表?
  • 如何将独立对象与父对象关联并单独保留它们?

  • 谢谢

    最佳答案

    对于#1,您可以清除集合(默认情况下它是一个集合):

    activePerson.locations.clear()
    

    #2 使用 addToLocations:
    activePerson.addToLocations(location)
    

    当你保存这个人时,位置<->人的关系将被更新。

    关于grails - 如何清除和替换 Grails/Groovy 中一对多关系中的集合,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2072705/

    相关文章:

    hibernate - withTransaction 和 withNewTransaction 有什么区别?

    grails - GORM 事件未在集成测试中触发

    hibernate - 如何配置 Grails 3.1.1 以使用 Hibernate 5

    hibernate - Grails 单元测试中不包含哪些动态方法?

    java - 如何将 jar 中的域类导入到 Micronaut 项目中?

    grails - grails分页标记禁止访问方法

    intellij-idea - IntelliJ最近的grails命令

    grails - 如何将 Grails 插件添加到 IntellIJ?

    grails - 为什么我在保存方法中收到此 ValidationException?

    grails - 保存域对象失败时默认 o.errors.allErrors.each { println it }