2010-04-26 167 views
2

我想使用Hibernate 3.5將規範化Java模型映射到傳統數據庫模式。一個特定的表格將位於一對多關係中的外鍵編碼爲位數組列。休眠位陣列到實體映射

考慮表personclub描述人的隸屬關係到俱樂部:

person: .----.------. club: .----.---------.---------------------------. 
     | id | name |   | id | name | members | binary(members) | 
     |----+------|   |----+---------|---------+-----------------| 
     | 1 | Bob |   | 10 | Cricket |  0 |    000 | 
     | 2 | Joe |   | 11 | Tennis |  5 |    101 | 
     | 3 | Sue |   | 12 | Cooking |  7 |    111 | 
     '----'------'   | 13 | Golf |  3 |    100 | 
           '----'---------'---------'-----------------' 

所以希望很顯然,person.id用作位陣列club.members在位索引:

.---.---.---. 
| S | J | B | 
| u | o | o | 
| e | e | b | 
|---+---+---| 
| 1 | 0 | 1 | 
'---'---'---' 

在這個例子的members列告訴我們:

  • 沒有一個是板球---沒有標誌設置
  • 鮑勃/蘇的成員 - >網球---在位置1和3標誌設置
  • 鮑勃/蘇/喬 - >烹飪---在位置1,2和3標誌設置
  • 蘇 - >高爾夫球---在第3位標誌設置

現在,在這個例子中連接表可以一直使用,而不是這將事情簡單化並避免許多潛在的問題 - 例如:members的最大範圍對people行的數量設置了上限。然而,我堅持這個模式,似乎有些人贊成使用位數列的方式。

在我的Java領域我想這個模式與實體,像這樣的模型:

class Person { 
    private int id; 
    private String name; 
    ... 
} 

class Club { 
    private Set<Person> members; 
    private int id; 
    private String name; 
    ... 
} 

我假設我必須使用UserType實現,但一直無法尋找到的物品描述的任何示例用戶類型是對實體的引用 - 而不是文字字段值 - 或其組合。此外,我知道我將不得不考慮在加載club實例時如何獲取person實體。

誰能告訴我如何用Hibernate來馴服這個遺留模式嗎?

更新

我最近不得不重新審視這種類型的映射在傳統的數據庫。這一次變得很明顯,我們的members表的等價物實際上是一個靜態集,可以硬編碼爲Enum。通過這種簡化,實現在位陣列和一組枚舉之間轉換的Hibernate UserType相當簡單。

+0

是你永遠能算出這個? – rj2700 2016-12-15 04:26:25

回答

1

我從未遇到過這種情況,但我認爲,你需要實現自定義UserCollectionType(見Hibernate的核心文檔中章5.2.3. Custom value types),該UserCollectionType是一個擴展點可用於支持任何該死的收集和收集語義你喜歡

雖然我不確定它們有多好的註釋支持(根據HHH-4417,您可能需要使用黑客)。在這裏使用hbm.xml將是一個好主意。

一些更多的指針/討論:

+0

不幸的是,在這種情況下,'UserCollectionType'似乎不是很有用。它的目的是讓Hibernate使用從一個連接加載的一堆實體來填充你選擇的「集合」。我的情況完全不同 - 我需要讓Hibernate將字段中的值解釋爲實體的一組鍵,然後爲這些實體創建代理,然後將這些代理添加到「集合」中。無論如何 - 謝謝你的建議! – teabot 2011-03-22 15:20:22

+0

您是否想過將數據庫中的數據轉換爲臨時表,然後從該簡化聚合創建映射?你可能只能閱讀,但只是一個想法。 – JamesC 2011-03-23 15:06:29