2012-02-03 53 views
0

我有3個類
Class1具有帶有class2元素的列表。
這是通過連接表映射的(不能用外鍵映射,因爲鍵不會是唯一的)!HIbernate加載與深度2的關係

Class2有一個class3的外鍵。
Class3不保存任何關係。

整個事情是這樣的:

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: 
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的元素與session.load( Class1.class,id)我得到的對象。但!
我可以訪問class1.class2(元素列表),但是當我嘗試訪問class1.class2.class3時,它給了我一個例外,即由於沒有會話而無法執行延遲加載。
由於我的數據結構,此時我無法打開會話。
我需要加載所有的數據庫訪問權限。

所以,現在我的問題:我可以改變一切都會一次加載的映射嗎?如果我不能如何在1會話中加載所有內容並返回一個class1對象,我可以訪問class1.class2.class3? 感謝

回答

0

我不熟悉XML配置(語法),但不能使用定義Class2 UND Class3也渴望像你這樣有Class1Class2lazy=false)之間的關係之間的關係? fetch="join"應該自動設置此值,但很明顯它不會以這種方式執行。

(我不會告訴你是剛剛接觸到的物體的黑客,同時仍然在會話中會加載(如class1.getClass2().getClass3() // Slightly different in your case because of many-to-many),因爲這將是一個黑客。)

這是通過jointable映射(不能用外鍵映射,因爲鍵不會是唯一的)!

您可以通過Hibernate在鍵列上設置一個unique約束。然後甚至可以用一個語句和連接來選擇所有的東西(這應該是自動的)。