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

そんなことはできません。

1 対多の関連付けでは、外部キーは「1」の部分に入れられます。

あなたの例から、人 x が人 y の子供である場合、それは人 y が人 x の親であることを意味しないことを理解していますか? 人 x は両親を持つことができます: 人 z と人 t?

最初に、x が 1 つの親しか持つことができず、x が y の子である場合、y は x の親である場合について説明します。

この場合、デフォルト値が null の新しい列 parent_id を追加し、hasMany [children: Person] と belongsTo [parent: Person] だけを指定します。これにより、1 つの子が 1 つの親しか持つことができない場合が解決されます。

もう 1 つのケースでは、1 人の子が複数の親を持つことができ、誰かの子である必要がない場合、その子の親になるには 2 つのオプションがあります。 、しかし NoSQL では許容されます) 2. テーブルを接続します(2)。これは、ポリモーフィックな 1 つの接続テーブル、2 つの接続テーブル、または 3 つの列を持つ 1 つの接続テーブルであり、そのうちの 1 つは常に null になります。次に、属している部分に 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 に答える