And*_*ess 4 grails groovy hibernate nhibernate-mapping grails-orm
我的问题基于以下(简化)Grails域类
class Dimension {
String name
static hasMany = [
children: Dimension,
parents: Dimension
]
}
Run Code Online (Sandbox Code Playgroud)
有没有办法将多对多父母/子女关系映射到单个联接表?
据我所知,唯一的方法是创建另一个代表父子关系的域类.
class DimensionDependency {
Dimension parent
Dimension child
static belongsTo = Dimension
}
class Dimension {
static hasMany = [parentDependencies: DimensionDependency]
static mappedBy = [parentDependencies: 'child']
static mapping = { parentDependencies cascade: 'all-delete-orphan' }
}
Run Code Online (Sandbox Code Playgroud)
该mappedBy关键字指定指的一个对象DimensionDependency永远是孩子.通过all-delete-orphan在映射中指定,我们确保parentDependency从子项中删除a时,DimensionDependency将从数据库中删除关联.
您还可以在Dimension类中添加便捷方法以封装操作DimensionDependencies,以使界面更像GORM.
static transients = ['children', 'parents']
Set<Dimension> getChildren()
{
AssignmentDependency.findAllByParent(this).child
}
Set<Dimension> getParents()
{
parentDependencies?.parent ?: []
}
Dimension addToParents(Dimension parent)
{
if (!parentDependencies.find { it.parent == parent && it.child == this })
{
addToParentDependencies(new DimensionDependency(parent: parent, child: this))
}
return this
}
Dimension removeFromParents(Dimension parent)
{
def dep = parentDependencies.find { it.parent == parent }
removeFromParentDependencies(dep)
dep.delete(flush: true)
return this
}
Run Code Online (Sandbox Code Playgroud)
我一直在使用这种方法,到目前为止没有遇到任何麻烦.
| 归档时间: |
|
| 查看次数: |
1010 次 |
| 最近记录: |