Hibernate(6)—— 一对多和多对多关联关系映射(xml和注解)总结
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
Hibernate(6)——一对多和多对多关联关系映射(xml和注解)总结涉及的知识点总结如下:
∙One to Many 映射关系
o多对一单向外键关联(XML/Annotation)
o一对多单向外键关联(XML/Annotation)
o懒加载和积极加载
o一对多双向外键关联(XML/Annotation)
∙Many to Many 映射关系
o多对多单向外键关联(XML/Annotation)
o多对多双向外键关联(XML/Annotation)
o set的inverse元素详解
∙问题小结
∙关联关系的优缺点
多对一单向外键关联关系
注意多对一关联是多方持有一方的引用。看一个例子,去淘宝购物,那么一个淘宝用户可以对应多个购物订单,如图所示:
多的一方是Orders,持有一方的引用,也就是Users,而在Users中无需作任何定义,从订单到用户的关系是单向多对一关联。对应数据库就是:
还有比如说学生和班级的关系,多个学生可以属于同一个班级,这就是从学生到班级也是典型的单向多对一关系,看代码实现:
基于注解的多对一单向外键关联:
单向多对一关联中,多方需要持有一方的引用,那么多方(学生类)需要额外配置,需要对持有的一方引用使用注解@ManyToOne (cascade={CascadeType.ALL}, fetch=FetchType.EAGER),设置为级联操作和饥渴的抓取策略,@JoinColumn(name="cid"),而一方(教室类)无需做任何多方的定义。
注意;多方必须保留一个不带参数的构造器!
importjavax.persistence.Entity;
importjavax.persistence.GeneratedValue;
importjavax.persistence.Id;
//班级类,在多对一关系中属于一的方,不持有其他多余的配置,反而是被多方持有
@Entity
public class ClassRoom {
private intcid;//班级编号
private String cname;//班级名称
// 自动增长的主键
@Id
@GeneratedValue
publicintgetCid() {
returncid;
}
public void setCid(intcid) {
this.cid = cid;
}
public String getCname() {
returncname;
}
public void setCname(String cname) {
ame = cname;
}
}
View Code
一方——班级类无需做多余的定义,下面是多方——学生实体和配置:
importjavax.persistence.CascadeType;
importjavax.persistence.Entity;
importjavax.persistence.FetchType;
importjavax.persistence.GeneratedValue;
importjavax.persistence.Id;
importjavax.persistence.JoinColumn;
importjavax.persistence.ManyToOne;
//学生实体类,属于多对一的多方,持有班级(一方)的引用@Entity
public class Students {
private intsid; //编号
private String sname; //姓名
private ClassRoom classroom;//学生班级
//注意:多方一定要显式的定义不带参数的构造方法public Students() {
}
public Students(String sname)
{
this.sname = sname;
}
// 多方使用注解:@ManyToOne
// fetch=FetchType.EAGER,急加载,加载一个实体时,定义急加载的属性会立即从数据库中加载。
// 全部级联操作,referencedColumnName显式设置数据库字段名cid,不写默认就是和name一样的。
@ManyToOne (cascade={CascadeType.ALL}, fetch=FetchType.EAGER)
@JoinColumn(name="cid",referencedColumnName="cid") publicClassRoomgetClassroom() {
return classroom;
}
public void setClassroom(ClassRoom classroom) {
this.classroom = classroom;
}
// 自动增长主键
@Id
@GeneratedValue
publicintgetSid() {
returnsid;
}
public void setSid(intsid) {
this.sid = sid;
}
public String getSname() {
returnsname;
}
public void setSname(String sname) {
this.sname = sname;
}
}
View Code
下面测试:先生成数据库脚本,再进行学生对象的插入
public class TestStudentsByAnno {