Sim*_*mon 11 grails grails-orm
这个问题分为两部分,第一部分是关于清除列表,第二部分是关于将所有者分配给一个对象.
我在Grails的模型中有两个域对象之间的一对多关系.这种关系看起来像这样......
class Person {
static hasMany = [authorities: Role, locations: Location]
}
class Location {
static belongsTo = Person
}
Run Code Online (Sandbox Code Playgroud)
在我的应用程序中,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()
Run Code Online (Sandbox Code Playgroud)
只需尝试迭代收集,避免ConcurrentModificationException通过调用collect():
activePerson.locations.collect().each {
item.removeFromLocations(it)
}
Run Code Online (Sandbox Code Playgroud)
然后保存实体以执行SQL语句:
activePerson.save flush:true
Run Code Online (Sandbox Code Playgroud)
链接到文章阅读更多:http: //spring.io/blog/2010/07/02/gorm-gotchas-part-2/
对于#1,您可以清除集合(默认情况下为Set):
activePerson.locations.clear()
Run Code Online (Sandbox Code Playgroud)
对于#2,使用addToLocations:
activePerson.addToLocations(location)
Run Code Online (Sandbox Code Playgroud)
当您保存人员时,< - >人员关系将被更新.
虽然这是一个较老的问题,但我遇到了一个非常类似的情况,我想更新一组子记录.这是我选择解决它的方式.为简单起见,我将使用与问题提问者相同的对象/关系名称.
在mapping父域的块中,添加:
static mapping = {
locations(cascade: "all-delete-orphan")
}
Run Code Online (Sandbox Code Playgroud)在子域中,添加@EqualsAndHashCode注释(以防万一其他人潜伏,我指的是groovy.transform.EqualsAndHashCode).
使用Grails addTo方法(例如addToLocations)将所有子元素添加到父域,然后保存父域.
虽然这种方法确实需要保存父域(提问者不想这样做),但鉴于belongsTo模型中的清晰定义,它似乎是最合适的方法.因此,我会回答提问者这样的编号问题:
不要手动执行,而是让Grails/Hibernate通过指定all-delete-oprhan关系上的级联行为来清除记录.
不要尝试直接保存子记录,而是保存父对象以匹配Grails的预期.
| 归档时间: |
|
| 查看次数: |
13964 次 |
| 最近记录: |