【问题标题】:JoinColumn annotation creates column on same tableJoinColumn 注释在同一张表上创建列
【发布时间】:2020-01-20 15:02:39
【问题描述】:

我是 Hibernate 的新手,正在努力学习它。我对@JoinColumn 的使用感到困惑。我知道它创建了一个列来关联两个实体。我试过的是:

  1. 有两个类 Person 和 House
  2. Person 类有一组具有 OneToMany 关系的 House

个人类:

    @OneToMany(cascade = CascadeType.ALL)
    @JoinColumn(name = "person_id")  // this creates a FK on house table  with this name
    private Set<House> houses = new HashSet<House>();

这会在 House 表上创建一个名为 person_id 的列。

内部课程:

    @ManyToOne
    @JoinColumn(name = "house_id")
    private Person person;

这会在House 表上再次创建house_id 列。但我期待在Person 表上看到此列。为什么会这样?

我在想@JoinColumn 注释会在表上创建一个连接列,这是我们应用此注释的实体。因此,在这种情况下,对于 Person 类,它在 house 表上创建了 person_id,而对于第二个,我希望在 person 类上看到 house_id。但它也在房子的桌子上创建它。所以我很困惑。

那么它实际上是如何工作的呢?

【问题讨论】:

  • 您是否尝试指定属性mappedBy,例如:@OneToMany(mappedBy="houses")
  • 是的,我试过了,这样实际上就不那么混乱了,非常感谢。

标签: hibernate jpa orm hibernate-mapping


【解决方案1】:

尝试用@JoinColumn(name = "person_id") 替换@JoinColumn(name = "house_id") 假设房子有一个名为person_id 的列

然后删除@JoinColumn(name = "person_id") 并在 OneToMany 注释中添加属性 mappedBy

@OneToMany(cascade = CascadeType.ALL, mappedBy = "person")

这样hibernate会搜索所有person属性与当前person_id匹配的房子

【讨论】:

    【解决方案2】:

    @JoinColumn 创建一个有意义的列

    对于@OneToMany@JoinColumn,连接列需要到目标实体表,即House。如果该列是在源实体表中创建的,即Person,则一个人只能分配一个房子,所以它不会是一对多的关联。

    相反,对于@ManyToOne@JoinColumn,连接列需要转到源实体(即House)。如果该列改为Person 表,并且您将给定的人分配到一所房子,则PERSON.HOUSE_ID 列将设置为该房子的ID。然后,将无法为同一个人分配另一所房子(因为PERSON.HOUSE_ID 列已经被“使用”了)。这与之前的问题本质上是相同的,但从协会的“房子”方面来看。

    【讨论】:

    • 我整天都在寻找。非常感谢 :)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-10-18
    • 1970-01-01
    • 2020-03-24
    • 1970-01-01
    • 1970-01-01
    • 2011-03-07
    • 1970-01-01
    相关资源
    最近更新 更多