2012-01-15 75 views
10

我看到很多能夠使用Hibernate來持續像Map<String, Set<Entity>>這樣的地圖,但運氣不好(特別是因爲我希望它全部放在一張桌子上)。有沒有更好的方法來堅持一個值爲一組的地圖?

Mapping MultiMaps with Hibernate是似乎最被引用的東西,它詳細描述瞭如何使用UserCollectionType來實現這個功能。

我在想,因爲這是四年前寫的,現在有沒有更好的方法呢?

因此,例如,我想在EntityA上有一張像Map<String, Set/List<EntityB>>的地圖。

將會有兩個表格:EntityAEntityBEntityB具有返回到EntityA的外鍵)。

我不想要任何中間表。

+1

海事組織仍然走的路 – Firo 2012-01-15 17:14:59

+0

我不明白爲什麼這是值得downvoting或關閉。有一種「最好」的方式,但四歲。我不認爲問現在是否有更好的方法是不合理的。也許我應該更好地減少冗長或更簡單,但仍然不是真正的爭論或意見。有一個答案或沒有。 – AHungerArtist 2012-01-15 22:16:26

+0

+1來補償downvote。 IMO是一個法律問題。 – Firo 2012-01-16 10:50:52

回答

-1

這取決於:)當事情變得複雜時,您應該瞭解您的應用程序正在做什麼。

在某些情況下,您可能會將您的Set設置爲TreeSet,並以有序的編碼字符串表示此TreeSet,例如[「1」,「8」,「12」],其中1,8,12是主鑰匙,然後我們來寫代碼

很明顯,在我看來,這不是一個普遍的答案,是一個過於籠統的問題。

1

的方式及其對我目前的項目是如何做到的是,我們使用XStream的轉化豆/收藏到XML:

public static String toXML(Object instance) { 
    XStream xs = new XStream(); 
    StringWriter writer = new StringWriter(); 
    xs.marshal(instance, new CompactWriter(writer)); 
    return writer.toString(); 
} 

,然後用高吊球類型在Hibernate中,爲了堅持:

@Lob 
@Column(nullable = false) 
private String data; 

我發現這種方法非常通用,你可以有效地實現靈活的鍵/值存儲。你不喜歡XML格式,那麼Xstream框架內置了用於將對象轉換爲JSON的驅動程序。試試看,它非常酷。

乾杯

編輯:對評論的迴應。 是的,如果你想克服經典方法的限制,你可能會犧牲索引和/或搜索。您可以通過自己實現通過集合/泛型實體bean實現索引/搜索/外部/子級關係 - 只需使用您認爲需要搜索的屬性名稱/屬性值來維護單獨的鍵/值表。

我見過很多產品的數據庫設計,這些產品的靈活性和動態性(即爲無停機時間的領域對象創建新屬性)架構是必要的,其中許多數據庫使用鍵/值表來存儲來自所有者對象的域屬性和引用給孩子一個。這些產品花費數百萬美元(銀行/電信),所以我想這種設計已被證明是有效的。

對不起,這不是你的原始問題的答案,因爲你問沒有中間表的解決方案。

+0

有趣的解決方案。但是,不幸的是,這使得在搜索中使用它非常困難/效率低下。 – AHungerArtist 2012-02-01 15:22:38

+0

回覆編輯。 – 2012-02-03 05:02:44

相關問題