2014-01-15 27 views
0

我有一個問題,通過聯接表,雙向訪問,在一個方向,而不是在其他。我不得不匿名定義,但希望所有重要的東西都在那裏。場景是:休眠的雙向訪問和非法訪問加載收集

MASTER是一個具有兩個表A_SECTION和B_SECTION的一對一映射的主表,它們是主記錄的子部分,所有三個表共享一個公共ID。這是一個已經工作了多年的現有配置。

我添加了一個TIA_TIB_SHARE表,它表示MASTER表中兩行之間的許多關係 - 它將A_SECTION與另一個上的B_SECTION鏈接在一起。就我所知,兩種關係都是相同的,但是當通過A_SECTION從MASTER通過連接表訪問另一個MASTER時,如果從B_SECTION側訪問另一行,則會出現「非法訪問加載集合」錯誤。我試過沒有任何成功的延遲加載。

任何人都可以提供任何建議,爲什麼這項工作在一個方向,而不是在另一個,或我可以採取什麼步驟來診斷?我已經提取了下面的Hibernate映射文件的相關位 - 所有的映射都是XML格式的,並且沒有使用註釋。

在此先感謝...

<class name=」Master」 table=」MASTER」 where=」is_deleted=’N’」> 
<id name=」id」 column=」ID」 type=」long」> 
<generator class=」native」 /> 
</id> 
<one-to-one name=」sectionA」 class=」SectionA」 /> 
<one-to-one name=」sectionB」 class=」SectionB」 /> 

</class> 
<class name=」SectionA」 table=」A_SECTION」 where=」is_deleted=’N’」> 
<id name=」id」 column=」ID」 type=」long」> 
<generator class=」native」 /> 
</id> 
<one-to-one name=」master」 class=」Master」 
constrained=」true」 /> 
<set name=」shared」 sort=」natural」> 
<key column=」TIA_ID」 /> 
<one-to-many class=」Share」 /> 
</set> 
</class> 

<class name=」SectionB」 table=」B_SECTION」 where=」is_deleted=’N’」> 
<id name=」id」 column=」ID」 type=」long」> 
<generator class=」native」 /> 
</id> 
<one-to-one name=」master」 class=」Master」 
constrained=」true」 /> 
<set name=」sharing」 sort=」natural」> 
<key column=」TIB_ID」 /> 
<one-to-many class=」Share」 /> 
</set> 
</class> 

<class name=」Share」 table=」TIA_TIB_SHARE」> 
<id name=」id」 column=」ID」 type=」long」> 
<generator class=」native」 /> 
</id> 
<many-to-one name=」sharingA」 class=」SectionA」 
cascade=」all」 update=」true」 insert=」true」 column=」TIA_ID」 /> 
<many-to-one name=」sharedB」 class=」SectionB」 
cascade=」all」 update=」true」 insert=」true」 column=」TIB_ID」 /> 
</class> 
+0

已經做了更多的測試,看起來只有在多個集合包含多個行時纔會出現錯誤。有任何想法嗎? – boston1832

回答

0

這應該是一個評論,但因爲我不能寫一個: 我沒有一個解決方案,但如果你把不可─它可能使調試更輕鬆發現=「忽略」和某種顯式加入多對多定義(外連接可能工作)。

0

問題解決。我將這些映射粘貼到一個現有的集合中,並沒有注意到我保留了sort =「natural」子句。但是,我的測試數據在一次測試中有多行設置,另一行爲兩行。單行集合工作,但多行集合沒有,這是通過在我的Share類上實現equals(),hashCode()和compareTo()來解決的。

Hibernate無法實例化集合,因爲該類不是Comparable,但只有一行時這並不重要。我不確定爲什麼Hibernate選擇不在堆棧跟蹤中揭示它,而是返回LazyInitialisationException。