一、 简介
Hibernate的映射类型(最常用为一对多和多对一映射):
一对多 (one-to-many)
多对一 (many-to-one)
一对一 (one-to-one)
多对多 (many-to-many)
二、单向一对多关联
1. 定义
就像班级和学生。站在班级的角度看。班级和学生就是一对多的关系,班级为一方,学生为多方且是单向的。
如何实现这种关系?
1.在数据库中,可以通过添加主外键的关联,表现一对多的关系;
2.在java中,通过在一方持有多方的集合实现,即在“一”的一端中使用<set>元素表示持有“多”的一端的对象
2. 以班级和学生关联为例
(1) 创建工程,导入hibernate和数据库驱动相关jar包
(2) 配置hibernate.cfg.xml文件
(3) 创建HibernateUtil工具类,用以获取会话工厂,会话的创建和关闭
Tips:不同的hibernate版本,会话的获取方式不一样,需要注意
package com.imooc.util;
import com.imooc.entity.Grade;
import com.imooc.entity.Student;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.boot.registry.StandardServiceRegistryBuilder;
import org.hibernate.cfg.Configuration;
import org.hibernate.service.ServiceRegistry;
public class HibernateUtil {
private static final SessionFactory sessionFactory = buildSessionFactory();
private static SessionFactory buildSessionFactory() {
Configuration config = new Configuration().configure(); // 创建配置对象
config.addClass(Grade.class);
config.addClass(Student.class);
ServiceRegistry serviceRegistery = new StandardServiceRegistryBuilder().applySettings(config.getProperties()).build();
return config.buildSessionFactory(serviceRegistery);
}
public static SessionFactory getSessionFactory() {
return sessionFactory;
}
public static Session getSession() {return sessionFactory.openSession();}
//关闭Session对象
public static void closeSession(Session session){
if(session!=null){
session.close();
sessionFactory.close();
}
}
}
(4) MySQL数据库中建表
create table grade
(
gid int primary key,
gname varchar(20) not null,
gdesc varchar(50)
);
create table student
(
sid int primary key,
sname varchar(20) not null,
gender varchar(2) ,
gid int
);
alter table student add constraint fk_student_gid foreign key (gid)
references grade(gid);//对应表主键
Tips: Intellij IDEA集成的hibernate会自行建表,这一步可省略;但是根据实体类自动建表的话,就必须在Student实体类中定义Grade grade属性,否则因为建立关联时Student数据表中找不到gid这一项,会报错
(5) 创建持久化类和映射文件
Grade.java
package com.imooc.entity;
import java.io.Serializable;
import java.util.HashSet;
import java.util.Set;
public class Grade implements Serializable{
private int gid;
private String gname;
private String gdesp;
private Set<Student> students = new HashSet<>(); //一方持有多方的集合
/**getter和setter方法**/
{...}
public Grade() {
}
public Grade(String gname, String gdesp) {
this.gname = gname;
this.gdesp = gdesp;
}
public Grade(int gid, String gname, String gdesp, Set<Student> students) {
this.gid = gid;
this.gname = gname;
this.gdesp = gdesp;
this.students = students;
}
}
Student.java
package com.imooc.entity;
import java.io.Serializable;
public class Student implements Serializable {
private int sid;
private String sname;
private String gender;
//如果选择hibernate自动创建数据库表,这个属性不能漏掉
private Grade grade;
public Student(int sid, String sname, String gender) {
this.sid = sid;
this.sname = sname;
this.gender = gender;
}
public Student() {
}
public Student(String sname, String gender) {
this.sname = sname;
this.gender = gender;
}
}
Grade.hbm.xml