@JoinColumn和@MappedBy如何工作

eat*_*ode 4 java entity-relationship hibernate foreign-keys

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

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

@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<>();
}
Run Code Online (Sandbox Code Playgroud)

我有一个list of employeesDepartment class上,我已指定@JoinColumn,因此将增加department_id在FK employee table.

但是通过双向关系,我将定义类

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;
}
Run Code Online (Sandbox Code Playgroud)

但随着双向关系,为什么我需要放置@JoinColumndepartmentEmployee class写@ MappedBylist of employeesDepartment class

更新

那么@MappedBy和@JoinColumn如何运作?

Jor*_*lla 8

实际上,似乎你没有使用@MappedBy注释,而是mappedBy = "department"@OneToMany.

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

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

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

关于@JoinColumn它更容易,这里你有表外键,所以你告诉hibernate这不仅是一个列,而是一个必须连接表的列.

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

查找HERE hibernate映射文档.