Java @JoinColumn和@MappedBy的工作原理

Java @JoinColumn和@MappedBy的工作原理,java,hibernate,foreign-keys,entity-relationship,Java,Hibernate,Foreign Keys,Entity Relationship,我对@JoinColumn和@MappedBy的工作感到困惑 考虑下面的例子 这是我的系课,单向关系 @Entity @Table(name = "DEPARTMENT") public class Department { @Id @Column(name = "DEPARTMENT_ID") @GeneratedValue(strategy = GenerationType.AUTO) private Integer d

我对@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<>();
}
但是在双向关系中,为什么我需要将
@JoinColumn
放在
部门
员工类
上,并在
部门类
员工列表
上写入
MappedBy

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

事实上,你似乎不是在使用
@MappedBy
注释,而是在
@OneToMany
中使用
MappedBy=“department”

简单地说,mappedBy告诉
hibernate
,relationship的键在另一个表上(本例中为类)

考虑一下:通常在任何数据库系统中链接两个表时,其中只有一个表具有外键约束,对吗

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

关于
@JoinColumn
更简单,这里有表内外键,所以您告诉hibernate这不仅仅是一个列,而且是一个必须连接表的列

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


查找
hibernate
映射文档。

为什么第二
部门
映射没有
@表
@实体
注释?我忘了复制它。感谢@JordiCastilla注意到这一点。
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;
}