2016-12-27 52 views
0

我是新來的ORM,並就死在了以下問題(簡化這裏的討論):怎麼做的Hibernate ORM映射爲一個二維數組

我建模比賽,與競爭對手和學科。兩者都有自己的實體類。競爭對手每次只參加一次競賽,並獲得一個分數。只要競爭對手還沒有參加某個特定的學科,就沒有得分。

數據模型:

一個簡單的數據庫設計將是一個成績表的外鍵這兩個競爭對手錶和學科表。也就是說,我會建立兩個一對多的關係,外加對外鍵的完整性約束 - 只要存在引用任何一個的分數,我就不能刪除競爭對手或紀律。

但是,我該如何將這個二維數組(我的課程)映射到我的課堂上?我正在使用Java和Hibernate。 我目前的解決方案是將分數集合放入競爭對手實體類中,並且類似於Disciplines類。這爲兩個實體類中的每一個創建了與連接表的雙向關係。這是做映射的推薦方式嗎?

它確實從每個域類的角度映射關係,但是它錯過了二維數組結構。我想要輸出整個數組 - 例如在用戶界面上 - 包含競爭者的行,紀律的列以及相應表格單元格中的分數。如上所述,從實體類中構建這樣一個輸出是很乏味的,需要(a)遍歷競爭對手的集合,然後(b)查找相應的規則 - 或者反過來。

理想情況下,我希望有一個包含兩個鍵(如Guava Table或嵌套哈希映射)的哈希映射。我想這種高級集合沒有本地Hibernate映射。但也許有一個最佳實踐如何使用自定義查詢來實現它?

回答

0

但是,我該如何將這個二維數組(競爭者/學科)映射到我的類上?我正在使用Java和Hibernate。我目前的解決方案是將一組分數放入競爭對手實體類中,並且類似於Disciplines類。這爲兩個實體類中的每一個創建了與連接表的雙向關係。這是做映射的推薦方式嗎?

IIRC,隱式連接表不允許添加分數。即使是這樣,我也不會喜歡它,因爲分數實際上是主要信息。所以我想去一個明確的表格。

class Score { 
    @ManyToOne(optional=false) 
    Competitor competitor; 
    @ManyToOne(optional=false) 
    Discipline discipline; 
} 

這應該提供您需要的一切。您可能還需要Set<Score>Map<Discipline, Score>中的類Competitor(反之亦然),但您可能不需要它。該映射可能會使用@ManyToMany(mappedBy="competitor")@MapKey ......我沒有使用它,只要我發現我並不真的需要它。

理想情況下,我想有一個哈希映射與兩個鍵,如番石榴表,或嵌套哈希映射。

使用默認的@ManyToOne(fetch=EAGER),使用JOIN自動獲取所需的競爭對手和學科。我很害怕,一個List是所有你能得到的,但一旦它迭代和填充番石榴Table很簡單:

list.stream() 
.forEach(score -> table.put(score.competitor, score.discipline, score)); 

但不要忘記,實體是可變的,但在使用時必須不被突變作爲關鍵。顯然,你應該只取得你需要的實體,而不是過濾Table。但是,一旦你有了Table,你可以隨意使用所有的操作; Hibernate不會再幫你了,但你不需要它(而且你不想再次擊中數據庫)。

相關問題