【问题标题】:One-To-Many Relationship with Join Table与连接表的一对多关系
【发布时间】:2010-11-25 13:57:53
【问题描述】:

我有一个使用连接表建模的一对多关系:

create table t1 (id int primary key, name varchar(10) /*...*/);
create table t2 (id int primary key, name varchar(10) /*...*/);
create table t1_t2 (t1_id int, t2_id int, primary key (t1, t2));

这些表应该模拟一个 t1 到多个 t2 的关系。使用 JPA 对这些表建模的正确方法是什么?

【问题讨论】:

标签: java jpa persistence


【解决方案1】:

一个 T1 到多个 T2 的典型表是在 T2 上有一个指向 T1 的外键。通常不需要 T1_T2 表。

JPA 结构将是一对多,可能是双向的。


可能会有一些安排,以使您描述的结构发挥作用。您可以更改 T1_T2:

  • 在 T2 上添加唯一约束(这样就只允许一个 T2)

这真的是你想要的吗?

已编辑:是的,这就是你想要的 ;-)

我怀疑你会在网上找到很多例子。我没有经过验证的解决方案,但我会尝试以下方法:

Hibernate annotation reference documentation 中,请参阅“2.2.5.3.2.3. 单向连接表”以了解此想法。它看起来像:

    @Entity
    public class Trainer {
        @OneToMany
        @JoinTable(
            name="TrainedMonkeys",
            joinColumns = @JoinColumn( name="trainer_id"),
            inverseJoinColumns = @JoinColumn( name="monkey_id")
        )
        public Set<Monkey> getTrainedMonkeys() {
        ...
    }

【讨论】:

  • 感谢您的回复。我的确实不是最典型的结构,但我还有其他原因使它更适合。 T2 的唯一约束是可能的,但我仍然不明白应该如何使用 JPA 注释对其进行建模。能否进一步解释一下?
  • 谢谢。这真的很翔实。在设计上,当 T2 中实际与 T1 相关的记录数量较少时,您可以选择单独的连接表,而不是 T2 中的t1_id,主要是NULL
  • 我有一个案例,保留连接表不仅更合适,而且是强制性的。当子实体可以是多种父实体的 1:M 子实体时。在这种情况下,您不能在子实体中拥有 fk 列,并且必须使用连接表。
  • HDave 是正确的 - 有中间表是一种非常常见的模式,并不总是直接关系。考虑 Cars and Owners 或任何其他示例。一辆下线的汽车可能有 VIN,但没有车主,但如果有,则只有一个。在这种情况下,将有 Owner 和 Car 表以及一个 Owner_Car 表,该表显示给定 Owner 拥有的汽车(可能很多)。从汽车到车主没有直接的 FK。 JPA 让这件事变得非常困难(恕我直言),这可能是因为它最初旨在解决一组过度简化的案例。
  • 一个真实的场景可能是一个文档类实体,其中文档可以在许多其他实体中关联,并保持所有关系不受其他实体管理。我希望这可以对其他人进行澄清。
猜你喜欢
  • 1970-01-01
  • 2014-03-18
  • 2015-03-22
  • 1970-01-01
  • 1970-01-01
  • 2018-09-04
  • 2014-02-14
  • 2012-06-15
  • 1970-01-01
相关资源
最近更新 更多