Hibernate一对多映射_慕课网笔记

一、 简介

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

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值