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 employees在Department 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)
但随着双向关系,为什么我需要放置@JoinColumn在department在Employee class写@ MappedBy过list of employees的Department class?
那么@MappedBy和@JoinColumn如何运作?
实际上,似乎你没有使用@MappedBy注释,而是mappedBy = "department"在@OneToMany.
简单来说,mappedBy告诉hibernate关系的关键是在另一个表(在这种情况下是类).
想一想:通常当您在任何数据库系统中链接2个表时,其中只有1个表具有外键约束而另一个表正确吗?
什么MappedBy允许您从不包含约束的表链接到另一个表.
关于@JoinColumn它更容易,这里你有表外键,所以你告诉hibernate这不仅是一个列,而是一个必须连接表的列.
使用
@JoinColumn看起来像@Column注释的注释声明连接列.它还有一个名为referencedColumnName的参数.此参数声明将用于连接的目标实体中的列.请注意,将referencedColumnName用于非主键列时,关联的类必须是Serializable.另请注意,非主键列的referencedColumnName必须映射到具有单个列的属性(其他情况可能不起作用).
查找HERE hibernate映射文档.
| 归档时间: |
|
| 查看次数: |
7020 次 |
| 最近记录: |