注:本文仅记录注解式开发的方法,HIbernate基本配置和基本使用见文章一,注解式关联映射开发见文章二。
文章一:Hibernate基本使用
文章二:Hibernate多表的关联关系、懒加载
一、注解式开发的优点:
Hibernate支持XML式开发与注解式开发,前面我们已经学过XML开发,XML开发中我们需要为每个实体类创建XML映射文件,通过XML映射文件建立数据库表与JAVA实体类的映射关系。
而注解式开发通过在JAVA实体类中使用JPA注解来建立数据库表与JAVA实体类的映射关系,不必再为每个实体类编写XML文件。
二、基本注解的使用:
注解 | 含义 |
---|---|
@Entity | 用在类上,将类与数据库表建立一一对应关系 |
@Id | 该注解下的属性对应数据库表的主键 |
@Column | 该注解为每个属性与数据库字段建立一一对应关系 |
@Basic | 主键使用@Id,非主键使用该注解 |
@Entity(name = "student")
public class Student {
@Id
@Column(name = "stuNo")
private String stuNo;
@Basic
@Column(name = "stuName")
private String stuName;
@Basic
@Column(name = "stuClass")
private String stuClass;
public String getStuNo() {
return stuNo;
}
public void setStuNo(String stuNo) {
this.stuNo = stuNo;
}
public String getStuName() {
return stuName;
}
public void setStuName(String stuName) {
this.stuName = stuName;
}
public String getStuClass() {
return stuClass;
}
public void setStuClass(String stuClass) {
this.stuClass = stuClass;
}
}
这样就将Student类与student表建立了关系,通过操作Student对象就可以对student表进行增删查改操作了。(具体CRUD操作间文章一)
三、多表关联关系:
XML式的多表关联关系见文章二,这里我们看一下如何使用注解建立多表的关联关系。
注解 | 含义 |
---|---|
@OneToOne | 一对一关联 |
@OneToMany | 一对多关联 |
@ManyToOne | 多对一关联 |
@ManyToMany | 多对多关联 |
@JoinColumn | 外键 |
@JoinTable | 多对多关联中关联的表 |
1.一对一单向关联:
班级表和班长表,班级表中有班长id字段。
@Entity(name = "clas")
public class Clas {
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Id
@Column(name = "clasNo")
private String clasNo;
@Basic
@Column(name = "clasName")
private String clasName;
//班级表中有班长类的对象,并使用@OneToOne注解建立关联关系,使用@JoinColumn标明外键
@OneToOne(cascade = CascadeType.ALL)
@JoinColumn(name = "clasMonitorNo")
private Monitor monitor;
}
@Entity(name = "monitor")
public class Monitor {
@Id
@Column(name = "monitorNo")
private String monitorNo;
@Basic
@Column(name = "monitorName")
private String monitorName;
}
2.一对一双向关联:
班级表和班长表,班级表中有班长id字段,班长表中有班级id字段。
@Entity(name = "monitor")
public class Monitor {
@Id
@Column(name = "monitorNo")
private String monitorNo;
@Basic
@Column(name = "monitorName")
private String monitorName;
//班长表中有班级类的对象,并使用@OneToOne注解建立关联关系,使用@JoinColumn标明外键
@OneToOne(cascade = CascadeType.ALL)
@JoinColumn(name = "monitorClassNo")
private Clas clas;
}
@Entity(name = "clas")
public class Clas {
@Id
@Column(name = "clasNo")
private String clasNo;
@Basic
@Column(name = "clasName")
private String clasName;
//班级表中有班长对象,使用mappedBy与班长类建立关联,形成双向关联
@OneToOne(mappedBy = "clas")
private Monitor monitor;
}
3.一对多(多对一)双向关联:
学校表和学院表,学院表中有学校id字段。
@Entity(name = "shcool")
public class School {
@Id
@Column(name = "schoolNo")
private String schoolNo;
//学校表是一方,使用@OneToMany
@OneToMany(mappedBy = "school")
private List<Academy> academys;
}
@Entity(name = "academy")
public class Academy {
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Id
@Column(name = "academyNo")
private String academyNo;
@Basic
@Column(name = "academyName")
private String academyName;
//学院表是多方,使用@ManyToOne
@ManyToOne
@JoinColumn(name = "academySchoolNo")
private School school;
}
4.多对多双向关联:
学生表和选课表,多对多关联中还应有一张中间表。
public class Student{
//JoinTable的name是中间表表名,joinColumns指定中间表中关联自己ID的字段,inverseJoinColumns表示中间表中关联对方ID的字段,joinColumn是列名
@ManyToMany
@JoinTable(name="sc",joinColumns={@JoinColumn(name="stuid")},inverseJoinColumns{@JoinColumn(name="cno")})
private List<Course> courses;
}
public class Course implements Serializable {
@ManyToMany(mappedBy="courses")
private List<Student> students;
}