Java @JoinColumn和@MappedBy的工作原理
我对@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
@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;
}