【问题标题】:How @JoinColumn and @MappedBy works@JoinColumn 和 @MappedBy 如何工作
【发布时间】:2015-12-03 02:28:18
【问题描述】:

我对 @JoinColumn 和 @MappedBy 的工作感到困惑。

考虑以下示例 这是我的具有单向关系的部门类

@Entity
@Table(name = "DEPARTMENT")
public class Department {
    @Id
    @Column(name = "DEPARTMENT_ID")
    @GeneratedValue(strategy = GenerationType.AUTO)
    private Integer departmentId;
    @Column(name = "DEPARTMENT_NAME")
    private String departmentName;
    @Column(name = "LOCATION")
    private String location;

    @OneToMany(cascade = CascadeType.ALL, fetch = FetchType.LAZY)
    @JoinColumn(name = "DEPARTMENT_ID")
    private List<Employee> employees = new ArrayList<>();
}

我在Department class 中有一个list of employees,我在上面指定了@JoinColumn,所以它会在employee table 中添加department_id FK。

但是对于双向关系,我将定义类

Department.java
@Entity
@Table(name = "DEPARTMENT")
public class Department {
    @Id
    @Column(name = "DEPARTMENT_ID")
    @GeneratedValue(strategy = GenerationType.AUTO)
    private Integer departmentId;
    @Column(name = "DEPARTMENT_NAME")
    private String departmentName;
    @Column(name = "LOCATION")
    private String location;

    @OneToMany(cascade = CascadeType.ALL, fetch = FetchType.LAZY, mappedBy = "department")
    private List<Employee> employees = new ArrayList<>();
}

Employee.java
@Entity
@Table(name = "EMPLOYEE")
public class Employee {
    @Id
    @SequenceGenerator(name = "emp_seq", sequenceName = "seq_employee")
    @GeneratedValue(generator = "emp_seq")
    @Column(name = "EMPLOYEE_ID")
    private Integer employeeId;
    @Column(name = "EMPLOYEE_NAME")
    private String employeeName;

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

但是对于双向关系,为什么我需要在Employee class 中将@JoinColumn 放在department 上,并在Department class 中将@MappedBy 放在list of employees 上?

更新

那么@MappedBy 和@JoinColumn 是如何工作的呢?

【问题讨论】:

  • 为什么第二个Department 映射没有@Table@Entity 注释?
  • 我忘记复制了。感谢@JordiCastilla 注意到它。

标签: java hibernate foreign-keys entity-relationship


【解决方案1】:

实际上,您似乎不是在使用@MappedBy 注释,而是在@OneToMany 中使用mappedBy = "department"

简单来说,mappedBy 告诉hibernate 关系的键在另一个表上(在这种情况下是类)。

想一想:通常当您在任何数据库系统中链接 2 个表时,其中只有 1 个对另一个具有外键约束,对吗?

MappedBy 允许您从不包含约束的表链接到另一个表。

关于@JoinColumn 更简单,这里你有表外键,所以你告诉hibernate 这不仅仅是一个列,而是一个必须加入一个表的列。

连接列是用@JoinColumn 注释声明的,看起来像@Column 注释。它还有一个名为 referencedColumnName 的参数。此参数声明将用于连接的目标实体中的列。请注意,当将 referencedColumnName 用于非主键列时,关联的类必须是可序列化的。另请注意,非主键列的 referencedColumnName 必须映射到具有单列的属性(其他情况可能不起作用)。

查找HEREhibernate映射文档。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-08-09
    • 1970-01-01
    • 2019-11-14
    • 2015-09-12
    • 1970-01-01
    • 2016-03-26
    • 2019-07-17
    相关资源
    最近更新 更多