Hibernate(6)—— 一对多和多对多关联关系映射(xml和注解)总结

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 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 {

相关文档
最新文档