Hibernate 关系映射注解
1.映射策略
外键关联:两个表的关系利用一方的id关联在另一个表中。
表关联:两个表的关系单独定义一个表中通过一个中间表来关联。
2.映射关系
- 一对一:一个人一张身份证
- 一对多:一个人出版了多本书
- 多对多:老师和学生
3.映射相关注解
3.1. 关系声明
- OneToOne 一对一
- OneToMany 一对多
- ManyToOne 多对一
- ManyToMany 多对多
3.2. 级联操作 Cascade
- PERSIST 级联保存
- REMOVE 级联删除
- REFRESH 级联刷新(查询)
- MERGE 级联更新合并
- ALL 级联所有操作
4.实例
4.1.OneToOne
people表
@Entity
@Data
public class People {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Integer id;
private String name;
private Integer age;
/**
* 默认会把one一方的主键关联
*/
@OneToOne
private IdCard idCard;
}
IdCard表
@Entity
@Data
public class IdCard {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Integer id;
private String num;
}
4.1.OneToMany
drug表
@Entity
@Data
public class Drug {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Integer id;
private String name;
private String price;
private String num;
}
patient表
@Entity
@Data
public class Patient {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Integer id;
private String name;//患者姓名
private Integer age;//年龄
/**
* 表关联一对多
* 一个患者对应多种药
* 外键关联 字段为patient_id 外键在drug表中
*/
@OneToMany(cascade = {CascadeType.ALL})
@JoinColumn(name="patient_id")
private List<Drug> drugs;
}
4.3.ManyToOne
drugA表
@Entity
@Data
public class DrugA {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Integer id;
private String name;
private String price;
private String num;
/**
* 默认会把one一方的主键关联
*/
@ManyToOne
private PatientA patientA;
}
patientA表
@Entity
@Data
public class PatientA {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Integer id;
private String name;//患者姓名
private Integer age;//年龄
}
参考一对多
4.3.ManyToMany
teacher表
@Entity
@Data
public class Teacher {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Integer id;
private String name;//
private Integer age;//
/**
*表关联
*/
@ManyToMany(fetch = FetchType.EAGER)
@JoinTable(name = "teacher_student", joinColumns = @JoinColumn(name = "student_id"),inverseJoinColumns = @JoinColumn(name = "teacher_id"))
private List<Student> students;
}
student表
@Entity
@Data
public class Student {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Integer id;
private String name;
private Integer age;
}
外表关联