1

我想建立一个可以有孩子和父母的“实体”类:

class Entity {
    static hasMany [childs: Entity, parents: Entity]
}

但我不知道如何映射我的数据(我应该使用 mappedBy 吗?)

我的测试:

@Test
void testEntityCanHaveAChild() {
    Entityparent = new Entity()
    Entitychild = new Entity()

    parent.addToChilds(child)

    assert parent.childs
    assert parent.childs.size() == 1
    assert parent.childs.contains(child)

    assert child.parents
    assert child.parents.size() == 1
    assert child.parents.contains(parent)
}

所以从父母那里我想得到所有的孩子,从孩子那里我想得到所有的父母

4

3 回答 3

1

你不能那样做。

在一对多关联中,外键被放入“一”部分。

现在从您的示例中我了解到,如果人 x 是人 y 的孩子,那并不意味着人 y 是人 x 的父母?人 x 可以有父母:人 z 和人 t?

我将首先讨论人 x 只能有一个父母的情况,如果 x 是 y 的孩子,那么 y 是 x 的父母。

对于这种情况,我将添加一个新列 parent_id,其默认值为 null 并只说 hasMany [children: Person] 和 belongsTo [parent: Person] 这解决了一个孩子只能有一个父母的情况。

对于另一种情况,当一个孩子可以有多个父母并且不需要成为某个孩子的孩子使该孩子成为该孩子的父母时,有两种选择:1. db 列中的 id 列表(我不喜欢在关系数据库中这样,但在 NoSQL 中是可以接受的) 2. 连接表(2)。这可以是一个连接表多态,2 个连接表或一个连接表具有 3 列,其中一个将始终为空。然后您需要将 belongsTo 添加到拥有部分。并手动设置连接表的映射。就像是:

   static mapping = {
   hasMany joinTable: [name: 'parent_child_connection',
                       key: 'person_id',
                       column: 'parent_id']
}
于 2013-08-15T13:53:27.480 回答
1

编辑:添加了 addToChilds

我要做的是引入另一个域,例如 ParentChild

class ParentChild {
    Person parent
    Person child 
}

然后修改人

class Person {
def parents() {
    ParentChild.executeQuery("select pc.parent from ParentChild pc where pc.child = :child", [child:this])
}

def children() {
    ParentChild.executeQuery("select pc.child from ParentChild pc where pc.parent = :parent", [parent:this])
}
def addToChilds(Person child){
    New ParentChild(parent:this, child:child).save()
}
}

对不起,我只熟悉 HQL。不知道如何以更干净的方式做到这一点

于 2013-08-16T04:30:30.310 回答
0

我发现这样做的唯一方法是在“两个表”之间添加一个多对多表并模拟这样的“自动关系”:

class EntityBound {
    Entity parent
    Entity child 
}

class Entity {
    static hasMany [bounds: EntityBound]


    def childs() {
        EntityBound.findAllByParent(this).collect{ it.child }
    }

    def parents() {
        EntityBound.findAllByChild(this).collect{ it.parent }
    }

    Entity addChild(Entity entity){
        addToBounds(new EntityBound(parent:this, child:child))
        return this
    }
}
于 2013-10-25T13:51:23.083 回答