2011-01-17 8 views
0

休止状態を学習している間に、私はHibernateが循環参照を持っているような状況に遭遇しましたが、この状況をどのようにして来るのかわかりません。休止状態での循環参照問題

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> 

を次のように私は私の中でこのような何かをしようとしたとき、私は親

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> 

のためのマッピングファイルである2つのクラスがあるしていますメインコード

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

ここでは本当の問題があります。イテレータメソッドまたはそれが親のような無限ループに入るコレクションメソッドを使用してリストを反復しようとするときの実際の問題は、ここにあります

私の今後の課題私は子クラスへのコレクション参照が非常に多くある親クラスを持っているので、多対1と多対1の関係を持っています。

だから、その状態で、これまで私は、それが循環参照に実行されます

parent.getChild().iterator() 

のような親エンティティから子を取得しようとするときようです。 私が間違ったトラック

答えて

0

日午前場合、私は、あなたがこのような状況持っている理解し何から私をこれを回避または修正する方法を私に勧めてください。この場合

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

を、あなたは、循環参照を持っていますこれはリンクされたリストの "古典的な"問題であり、これを検出するいくつかの手法(アルゴリズム)があります。

しかし、私は最初に、ビジネス要件が実際に循環依存の可能性を持つ構造を持つことを要求するかどうかを評価しました。そうでない場合は、addChild()メソッドまたはsetParent()メソッドに "check"を入れて、親/子が循環依存を作成しているかどうかを確認できます。単純な解決策は、トップレベルの親レコードに対して常に「parent = null」を要求することです。