Насколько я знаю, единственный способ сделать это - создать еще один класс домена , который представляет отношения родитель-потомок.
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
из дочернего объекта, связанный 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
}
Я использовал этот подход в течение некоторого времени и до сих пор не испытывал проблем.