2009-11-19 49 views
1

我映射一個專有數據庫冬眠使用Spring。在這裏面,有一對夫婦jointables的,對於實體A和實體B有以下模式:多@ManyToMany套連接表

CREATE TABLE AjoinB (
    idA int not null, 
    idB int not null, 
    groupEnum enum ('groupC', 'groupD', 'groupE'), 
    primary key(idA, idB, groupEnum) 
); 

正如你所看到的,這表明可以有多個A-B關係,這讓他們在不同的組。我想同,對實體第一線和第二對實體B結束了,下面套

Set<B> BforGroupC, BforGroupD, BforGroupE; 
Set<A> AforGroupC, AforGroupD, AforGroupE; 

到目前爲止,我只設法把它們放在一組,而忽視groupEnum關係屬性:

@ManyToMany(targetEntity=B.class, cascade={ CascadeType.PERSIST, CascadeType.MERGE }) 
@JoinTable(name="AjoinB", [email protected](name="idA"), [email protected](name="idB")) 
private Set<B> BforAllGroups; 

@ManyToMany(mappedBy = "BforAllGroups", targetEntity = A.class) 
private Set<A> AforAllGroups; 

我怎樣才能讓屬於他們無論是在C組,D組和獅多套?

乾杯

+0

在加入做這樣的事情@DiscriminatorColumn(NAME = 「groupEnum」,discriminatorType = ENUM)@DiscriminatorValue( 「C組」)將是美麗的:-) – niklassaers 2009-11-19 09:43:06

回答

3

如果你正在考慮此,沒有。現在的桌子便宜,所有的經濟都是如此,所以每個協會都要創建一個桌子。它會容易得多。

如果你用舊的數據庫約束,你不能改變這個表我會

  1. 考慮skaffman的溶液中的第一(+1,順便說一句)的結構。根據您的目標數據庫,您可以爲視圖添加一個觸發器,以插入足夠的「鑑別器」值。

  2. 如果上面是不是在你的數據庫可能,另一種解決方案是使用custom SQL for CRUD operations您的收藏。請記住,將NOT工作(例如,您的「鑑別值」將無法應用)作爲條件的一部分,涉及您的關聯的複雜HQL查詢。您也可以在上面混合/匹配 - 例如使用視圖並使用自定義SQL進行插入/刪除。

  3. 如果上述兩者都失敗,請按照framer8的建議與「關聯作爲單獨的實體」一起使用。這將是相當醜陋的(因爲我們這裏假設你不能改變你的表)由於組合鍵和所有多餘的代碼。事實上,如果您的任何關聯允許重複,則可能是不可能的。

+0

奇怪的是,關係上的屬性這麼簡單的事情對Hibernate來說太難了,所以我提出了一個bug。解決問題的辦法是在你的答案中混合#1和#2。非常感謝您的輸入:-) – niklassaers 2009-11-23 06:29:49

3

據我所知,Hibernate無法在你想要的方式使用這樣的「鑑別」一欄。 Hibernate需要每個連接表。

也許你也許能在桌子上定義其他的意見,表示各分組的?

+0

Skaffman您好,感謝您的建議。如果我定義了視圖「CREATE VIEW viewAjoinBgroupC AS SELECT idA,idB FROM AjoinB WHERE groupEnum ='groupC'」,那麼插入到我的集合中就像「insert into viewAjoinBgroupC VALUES(2,3);」,因此給我一個無效的條目(2,3,'groupC')。如果你有關於如何克服這個問題的建議,那麼這是一個解決方法,可以工作。 Cheers -Nik – niklassaers 2009-11-19 10:11:18

0

我認爲你需要訪問一個鏈接表中的字段隨時提醒的是,使鏈接表中的對象,並在自己的權利休眠實體。 A將具有一組AtoB對象,並且AtoB將具有一組B對象。我有一個類似的情況,其中鏈接表有一個用戶與鏈接相關聯。

select joinTable.b from A a 
left join a.AtoB joinTable 
where joinTable.group = 'C' 

它沒有hibernate完成的隱式連接那樣優雅,但它確實爲您提供了所需的控制。