这个问题分为两部分,第一部分是关于清除列表,第二部分是关于将所有者分配给一个对象。
我在Grails的模型中有两个域对象之间的一对多关系。这段关系看起来像这样......
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/
对于#1,您可以清除集合(默认情况下为Set):
activePerson.locations.clear()
对于#2,使用addToLocations:
activePerson.addToLocations(location)
当您保存人员时,< - >人员关系将被更新。
虽然这是一个较老的问题,但我遇到了一个非常类似的情况,我想更新一组子记录。这是我选择解决它的方式。为简单起见,我将使用与问题提问者相同的对象/关系名称。
mapping
块中,添加:
static mapping = {
locations(cascade: "all-delete-orphan")
}
@EqualsAndHashCode
注释(以防万一有另一个潜伏,我指的是groovy.transform.EqualsAndHashCode
)。addTo
方法(例如addToLocations
)将所有子元素添加到父域,然后保存父域。虽然这种方法确实需要保存父域(提问者不想这样做),但鉴于模型中明确的belongsTo
定义,它似乎是最合适的方法。因此,我会回答提问者这样的编号问题:
all-delete-oprhan
级联行为来清除记录。这对我有用:
activePerson.locations.clear()
activePerson.properties = params
...
activePerson.save()
这将清除一组位置,然后仅添加当前在params中选择的位置。