0

休止状態を学習しているときに、休止状態が循環参照をしているように見える状況に遭遇しました。この状況をどのように乗り越えればよいかわかりません。親に2つのクラスがあります

private String uuid;
private String name;
private Set<ChildClass> childclass=new HashSet<ChildClass>();

これが同じマッピングファイルです

<property name="name" type="string" column="NAME" length="255" />
    <set name="childclass" table="Parent_Child" lazy="extra"
        cascade="save-update">
        <key column="parent_id" />
        <many-to-many class="com.test.child.ChildClass" column="child_id"/>
    </set>

子エントリの場合は次のとおりです

private String name;
private Set<ParentClass> parent=new HashSet<ParentClass>();
private String child_id;

<property name="name" type="string" column="NAME" length="255" />
    <set name="parent" table="Parent_Child" inverse="true" lazy="extra"
        cascade="save-update">
        <key column="child_id"/>
        <many-to-many class="com.test.parent.ParentClass" column="PARENT_ID"/>
    </set>

メインコードでこのようなことを試したとき

tx1.begin();
String query="from ParentClass as pc";
Query query1=session1.createQuery(query);
List list= query1.list();

親が子を参照し、再び子が親を参照するように、イテレータメソッドまたはコレクションメソッドを使用してリストを反復しようとすると、ここに本当の問題があります。

私の今後の課題では、子クラスへの非常に多くのコレクション参照を持つ親クラスがあり、すべて多対1および1対多の関係があります。

そのため、その状態では、いつでも親エンティティから子を取得しようとするようです

parent.getChild().iterator()

循環参照に遭遇します。これを回避する方法を提案するか、間違った方向に進んでいる場合は修正してください

4

1 に答える 1

0

私が理解したことから、あなたはこのような状況に陥っています:

ID | name | parent
1  | P1   | null
2  | P2   | P4
3  | P3   | P2
4  | P4   | P2

この場合、ID 2 と 4 の循環参照があります。これはリンク リストの「古典的な」問題であり、これを検出するための手法 (アルゴリズム) がいくつかあります。スタックオーバーフローの回答には実際には適していないため、このトピックについて調査することをお勧めします;-)

しかし、私は最初に、循環依存の可能性がある構造を持つことがビジネス要件で本当に義務付けられているかどうかを評価します。そうでない場合は、「addChild()」または「setParent()」メソッドに「チェック」を入れて、親/子が循環依存関係を作成しているかどうかを確認できます。簡単な解決策は、最上位の親レコードに常に「parent = null」を要求することです。

于 2011-01-17T11:09:31.507 に答える