2010-04-14 88 views
1

我有一個類Player,它包含一個Accessory對象的列表。有兩種配件。 SocketedAccessories有一個SocketJewels列表,MagicAccessories有一個MagicEnchantments列表。Hibernate集合多種類型

在數據庫級別,有一個表示播放器的players表和一個包含附件列表的accessories表。附件中有一個類型字段,用於指示它們是插入式還是魔術式,而僅由一種類型使用的列僅由其他類型的條目留空。有socket_jewelsmagic_enchantments表,表示每個配件上的插槽寶石或魔法附魔。

我想找出正確的方法來映射這與休眠。一種方法是讓玩家有兩個配件清單,一個用於SocketedAccessories和一個用於MagicAccessories。儘管如此,這似乎是不可取的。我想要的是一種方式來指定該玩家應該有一個字段List<Accessory> accessories,其中包含兩種類型的東西。

有沒有辦法在hbm.xml或註釋中告訴Hibernate來做到這一點?

回答

2

有沒有辦法告訴Hibernate,無論是在hbm.xml或註釋,做到這一點?

什麼你所描述的一樣每個類層次戰略一個單表如下(所有超和子類的所有屬性都映射到同一個表,實例由一個特殊的鑑別列區別)。

您可以annotations和/或xml mappings地圖這(和有一個單一的List,Hibernate支持多態查詢,即您可以在Accessory超查詢,並得到子類列表)。

更新:如果配件是一個接口,看看this previous answer

+0

這是個好消息!雖然,如果我想擁有它們的列表,它看起來像「附件」必須是基類,而不是接口? – 2010-04-14 21:45:22

+0

@CaptainAwesomePants配件可以是一個接口。但是你可能必須使用hbm。 hibernate核心文檔實際上明確提到你可以使用接口。我將添加一個鏈接到另一個涵蓋與JPA接口的案例。 – 2010-04-14 22:17:48

+0

啊,我明白了,我錯過了Payment是一個接口這一事實(並且也錯過了「當前不支持註釋接口」一點)。謝謝! – 2010-04-14 22:40:55