2011-04-21 49 views
0

使用Hibernate,我试图实现一个固定域类型A和另一个类型为B的域类型B之间的一对一关系任何实现某个接口的类型。使用Hibernate的一种类型和另一种类型的子类之间的一对一关系

情况:

的系统具有三个不同的域类型;国家,仓库和商店,它们实现了接口FlagSubscriber。

我想加入FlagSubscribers与标志。每个Flag可以与0或1个FlagSubscribers配对。

实现:

在我为国家,仓库,商店和标志表,每个都有一个ID列和各种其他列的特定属性数据库。为了配对FlagSubscribers标志我创建了一个链接表看起来像这样:

  • FLAG_ID
  • subscriber_id
  • subscriber_type

ID字段是不言自明的subscriber_type是确定subscriber_id是否与国家,仓库或商店相关的文本字段。

问:

使用Hibernate注解,我怎么告诉Hibernate如何在旗类映射FlagSubscribers?

我想我需要使用鉴别器,但我不完全确定如何为我的具体情况做到这一点,或者即使这是可能的。

任何指向示例,建议或想法的指针都会受到欢迎!

+0

那么,一个Flag有FlagSubscribers,可以是国家,仓库或商店? – 2011-04-21 10:57:57

+0

@TheStijn是的,确切地说。 – SlappyTheFish 2011-04-21 15:03:20

回答

1

也许它可以使用@Any annotation映射,但我不知道它将如何与链接表一起玩。但是,由于FlagFlagSubscriber之间的关系是一对一的关系,因此您可以将其映射为无链接表。

另请注意,如果通过EntityManager接口使用Hibernate,它将无法工作,因为Hibernate 3.5。

+0

谢谢 - 从示例中看,这几乎完全是我想要的。我的情况的主要区别在于,链接对象的类型和ID存储在外部表中,所以我很难链接,但我不知道如何。 – SlappyTheFish 2011-04-21 12:30:10

+0

@SlappyTheFish:你看过了,如果你在示例中添加了@ @TableTable,会发生什么?除此之外,您始终可以将链接表建模为单独的实体。 – axtavt 2011-04-21 12:43:54

+0

最后,我将subscriber_id和subscriber_type列合并到了Flag表格中,然后删除了FlagSubscribers表格,这样您发布的链接中的示例就完美了 - 谢谢!关于链接,我发现这个答案http://stackoverflow.com/questions/217831/how-to-use-hibernate-any-related-annotations/217880#217880看起来好像它应该工作。 – SlappyTheFish 2011-04-21 15:01:51

0

我会去另一个设置:

无接口FlagSubscriber但3个subsclasses的(抽象)类:商店,仓库和国家。所有常见字段可能会被移动到FlagSubscriber,但我认为这可能被限制为

@ManyToOne private flag flag;

然后,您可以选择有一个单独的表FlagSubscriber,它将包含subscriber_id和表标志的外键。 FlagSubscriber的每个子类也将拥有它自己的具有相同ID的表。不需要鉴别器,因为hibernate会和所有的子类一起知道它实际是哪个类型(子类)(在id上它只能成功。

相关问题