【问题标题】:Hibernate Join column annotation refers to which table coulmnHibernate Join 列注解指的是哪个表列
【发布时间】:2016-03-28 16:58:45
【问题描述】:

我已经阅读了一些休眠关系映射教程。这有点令人困惑 - 休眠关系。

在第一个example 中,student 和 Department 表都有一个名为 department_id 的列。

在学生实体中,

@ManyToOne
@JoinColumn(name="department_id")
private Department department;

在部门实体中,

@OneToMany(mappedBy="department")
private Set<Employee> employees;
  1. @JoinColumn 指的是哪个表的列?
  2. 假设在部门表/实体中,department_id 被命名为id,那么如何引用呢?
  3. 还有为什么没有将 department_id 列指定为 Student 实体类中的列?

在第二个example 中,我明白了(如果我错了,请纠正我)学生需要通过 Student_Phone 一对多到电话,同时使用 student_id 连接到 student_phone。

在学生实体中,

@OneToMany(cascade = CascadeType.ALL)
@JoinTable(name = "STUDENT_PHONE", joinColumns = { @JoinColumn(name = "STUDENT_ID") }, inverseJoinColumns = { @JoinColumn(name = "PHONE_ID") })
public Set<Phone> getStudentPhoneNumbers() {
    return this.studentPhoneNumbers;
}

我的问题是使用 inverseJoinColumn 是什么。我知道 inverseJoinColumn 以某种方式用于连接到电话表。但我想

  1. 这种反向连接是如何建立的?
  2. 是要求 Phone 通过 phone_id 连接到 student_phone,反之亦然?

以上两个例子仅供参考。

persistence api 一样,它表示连接列根据映射类型引用目标或源表 fk。

如果有人能提供一种简单的方法来理解整个映射(通过示例),那将会很有帮助。

【问题讨论】:

标签: hibernate jpa


【解决方案1】:

1) Which table's column does @JoinColumn refer to?

它引用员工表中的外键列。

2) Suppose in department table/entity, department_id was named as id, then how will the referencing be done?

你总是使用外键列名,不管你的外键references如何休眠到你的父表。

3) Also why is department_id column not specified as column in Employee entity class?

在某种程度上,您已经拥有该映射,但您拥有 Object(Department) 映射。这就是ORM 的重要性所在。您指的是您的列的对象类型。

在第二个示例中,您使用的是连接表(可以在没有连接表的情况下实现,就像您的第一个示例一样),您只是描述谁拥有关系 (joinColumn) 而非拥有方是inverseJoinColumn,就像您的第一个示例中的 mappedBy

【讨论】:

  • joincolumn会一直引用源类的fk吗??与 hibernate api 一样,它表示连接列根据映射类型引用目标或源表 fk。
  • 在你的情况下,它取决于源表。仅取决于目标实体如果您有单向一对多,例如:假设DepartmentSet 的员工,但Employee 没有Department,那么@JoinColumn 应该打开SetDepartment 类中,它也将指向employee 表中的外键列。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-07-22
  • 1970-01-01
  • 2017-10-28
  • 1970-01-01
  • 1970-01-01
  • 2018-06-20
  • 2012-08-31
相关资源
最近更新 更多