2012-02-03 6 views
0

私は3つのクラスを持っています
Class1にはclass2の要素を持つListがあります。
これはジョイント可能です(キーは一意ではないため、外部キーとはマッピングできません)!HIbernate深度2の関係をロードする

Class2には、クラス3の外部キーがあります。
Class3はこの関係から何も保存しません。

は全体のものは以下のようになります。私は(たSession.loadでクラス1の要素を読み込むときに

Class1: 
List<Class2> class2; 

<bag name="class2" cascade="all" table="Class1_Class2" lazy="false" access="field"> 
    <key column="Class1_ID" /> 
     <many-to-many class="Class2" column="Class2_ID"/> 

Class2: 
Class3 class3 

<many-to-one name="class3" class="Class3" column="Class3_ID" fetch="join" unique="false"/> 

Class1    Class1-2 jointable   Class2 
+-----------+ +-----------+-----------+ +-----------+-----------+ 
| Class1_ID | | Class1_ID | Class2_ID | | Class2_ID | Class3_ID | 
+-----------+ +-----------+-----------+ +-----------+-----------+ 
| 1   | | 1   | 3   | | 3   | 10  | 
| 2   | | 2   | 7   | | 7   | 3   | 
| ...  | | ...  | ...  | | ...  | ...  | 
+-----------+ +-----------+-----------+ +-----------+-----------+ 

Class3 
+-----------+ 
| Class3_ID | 
+-----------+ 
| 10  | 
| 3   | 
| ...  | 
+-----------+ 

マッピングは次のようになりますClass1.class、id)私はオブジェクトを取得します。しかし!
class1.class2(要素のリスト)にアクセスできますが、class1.class2.class3にアクセスしようとすると、セッションがないために遅延読み込みを実行できないという例外が発生します。
私のデータ構造のため、この時点ではセッションを開くことができません。
1つのDBアクセスですべてをロードする必要があります。

私の質問:すべてを一度に読み込むマッピングを変更することはできますか?そして、私はどうやって1セッションですべてをロードし、class1.class2.class3にアクセスできるクラスclass1のオブジェクトを返すのですか? おかげ

答えて

0

私は(構文)XML設定に慣れていないですが、あなたはあなたのようなのように熱心Class3Class1Class2lazy=false)との関係で行ったClass2ウントとの間の関係を定義し使用することはできませんか? fetch="join"に設定する必要がありますが、この値は自動的に設定されますが、明らかにそのようには実行されません。

(それはハックになるので、まだセッション内)のような(class1.getClass2().getClass3() // Slightly different in your case because of many-to-manyそれをロードする間、私はあなただけのオブジェクトに触れるハックを教えてくれません。)これはjointableを経由してマッピングされている

(キーは一意ではないため、外部キーとマッピングすることはできません)。

キー列には、Hibernateを使用してuniqueという制約を設定できます。そして、1つのステートメントと結合ですべてを選択することも可能です(自動的に熱心になるはずです)。