我的问题基于以下(简化的)Grails域类
class Dimension { String name static hasMany = [ children: Dimension, parents: Dimension ] }
有没有办法将多对多的父母/孩子关系映射到单个联接表?
据我所知,唯一的方法就是 创建另一个 表示父子关系的 域类 。
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' } }
该mappedBy关键字指定对象指的一个DimensionDependency是永远的孩子。通过all-delete- orphan在映射中指定,我们确保parentDependency从子级删除a时,DimensionDependency将从数据库中删除关联的对象。
mappedBy
DimensionDependency
all-delete- orphan
parentDependency
您还可以在Dimension类中添加便捷方法来封装上的操作DimensionDependencies,以使界面更像GORM。
Dimension
DimensionDependencies
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 }
我使用这种方法已有一段时间了,到目前为止没有遇到任何麻烦。