2010-04-14 100 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