使用Hibernate在一种类型和另一种类型的子类之间建立一对一的关系

时间:2011-04-21 10:52:07

标签: hibernate annotations one-to-one discriminator

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

情况:

系统有三种不同的域类型; Country,Warehouse和Store,它们实现了FlagSubscriber接口。

我想加入FlagSubscribers with Flags。每个Flag可以与0或1个FlagSubscriber配对。

实施

在数据库中,我有Country,Warehouse,Store和Flag的表,每个表都有一个ID列和各种其他列的特定属性。为了将Flags与FlagSubscribers配对,我创建了一个链接表,如下所示:

  • FLAG_ID
  • subscriber_id
  • subscriber_type

id字段不言自明,subscriber_type是一个文本字段,用于确定subscriber_id是否与国家,仓库或商店相关。

问题:

使用Hibernate注释,如何告诉Hibernate如何在Flag类中映射FlagSubscribers?

我认为我需要使用鉴别器,但我不确定如何针对我的具体情况做这件事,或者即使有可能。

欢迎任何关于示例,建议或想法的指示!

2 个答案:

答案 0 :(得分:1)

也许它可以使用@Any annotation进行映射,但我不确定如何使用链接表。但是,由于FlagFlagSubscriber之间的关系是一对一的,因此您可以在没有链接表的情况下对其进行映射。

另请注意,如果通过EntityManager接口使用Hibernate,则自Hibernate 3.5起无效。

答案 1 :(得分:0)

我会去另一个设置:

没有接口FlagSubscriber而是一个带有3个子类的(抽象)类:Store,Warehouse和Country。可以将所有公共字段移动到FlagSubscriber,但我认为这可能仅限于

@ManyToOne 私人国旗;

然后,您可以选择使用单独的表FlagSubscriber,它将包含subscriber_id和表标志的外键。 FlagSubscriber的每个子类也有自己的具有相同id的表。不需要鉴别器,因为hibernate将与所有子类连接以了解它实际上是哪种类型(子类)(在id上它只能成功。