2012-10-08 36 views
5

我有一個多對多的關係,如果鏈接表有一個額外的字段。因此,關係根據下面教程2一個一對多關係來完成:休眠:在StackOverflowError中合併多對多結果

http://www.mkyong.com/hibernate/hibernate-many-to-many-example-join-table-extra-column-annotation/comment-page-1/#comment-122181

我有2個實體,其中定義的鏈路表,幷包括一個@Embeddable ID字段的第三實體。

的關係被定義爲:

@OneToMany(fetch = FetchType.LAZY, mappedBy = "pk.compound", cascade = CascadeType.ALL) 

@OneToMany(fetch = FetchType.LAZY, mappedBy = "pk.structure", cascade = CascadeType.ALL) 

是PK =所述@Embeddable ID字段。插入和刪除工作正常,但是當我打電話

session.merge(compound); 

我得到的StackOverflowError和日誌顯示冬眠正在噸select語句。請注意,數據庫只包含1個關聯,例如。 1化合物含有2個結構。它看起來像休眠進入無盡的循環。

我在http://giannigar.wordpress.com/2009/09/04/mapping-a-many-to-many-join-table-with-extra-column-using-jpa/上也看到過這個解決方案,但是如何更新這個?

+2

也許你正在通過多對多關係加載你的完整的多對多表。想象一下'A1'引用'B1'。 'B1'引用'A1'和'A2'。 'A2'引用'B2'。等等。隨着從關係的一側到另一側的每一次切換,您都會獲得額外的堆棧級別。 – SpaceTrucker

+0

堅持並加載工作,但在調用合併時出現問題。 –

+0

@SpaceTrucker,但合併應該管理前一個合併子操作訪問的實體。 beginner_請您分享您的完整實體與測試用例,以便我們能夠更好地幫助您。 –

回答

3

我的解決方案是在擁有一方使用FetctType.EAGER,在子方使用FetchType.Lazy,在鏈接表使用兩個ManyToOne關係。像這樣,我可以從擁有方加載而不會出現LazyInitializationException和mergign按預期工作。

0

我第二個SpaceTuckker的回答。我認爲堅持不是和合並一樣。合併會在持久化之前加載對象。堅持不。所以當你調用合併恕我直言,它需要加載懶惰的關係。如果你打電話堅持它沒有。

您也可以使用@ElementDependent將相關的@OneToMany關係標記爲依賴於另一個表。這是我通過連接表中的其他列解決多對多關係的方式。

+2

是的,但獲得實體的作品。所以我可以堅持下去,並在完全不同的會議中加載它,而不是問題。該問題僅在合併時發生。解決方案原來是將fetch = FetchType.LAZY添加到Embeddable ID類中的ManyToOne關係中。 –