【问题标题】:One-to-one relationship between one type and sub-classes of another type using Hibernate使用 Hibernate 的一种类型和另一种类型的子类之间的一对一关系
【发布时间】:2011-08-10 05:29:37
【问题描述】:

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

情况:

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

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

实施:

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

  • flag_id
  • subscriber_id
  • 订阅者类型

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

问题:

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

我认为我需要使用鉴别器,但我不确定如何针对我的具体情况执行此操作,或者即使可能。

非常欢迎任何指向示例、建议或想法的指针!

【问题讨论】:

  • 那么,Flag 的 FlagSubscribers 可以是 Country、Warehouse 或 Store?

标签: hibernate annotations one-to-one discriminator


【解决方案1】:

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

另外请注意,如果通过EntityManager 接口使用 Hibernate,则自 Hibernate 3.5 起它将无法工作。

【讨论】:

  • 谢谢 - 从示例中这看起来几乎正是我想要的。在我的案例中,主要区别在于链接对象的类型和 ID 存储在外部表中,所以我必须以某种方式链接,但我不确定如何。
  • @SlappyTheFish:您是否检查过如果在示例中添加@JoinTable 会发生什么?除此之外,您始终可以将链接表建模为单独的实体。
  • 最后,我将subscriber_id 和subscriber_type 列合并到Flag 表中,然后删除了FlagSubscribers 表,因此您发布的链接中的示例完美运行-谢谢!关于链接,我发现这个答案stackoverflow.com/questions/217831/… 看起来应该可以工作。
【解决方案2】:

我会去另一种设置:

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

@ManyToOne 私有标志标志;

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

【讨论】:

    猜你喜欢
    • 2011-08-05
    • 2021-04-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-03-28
    • 2011-05-30
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多