源码地址:https://github.com/weiliangchun/JavaCode/tree/master/hibernateImooc/1-2Hibernate-one2many

第一章 课程简介

映射类型

  • 一对多(one-to-many)
  • 多对一(many-to-one)
  • 一对一(one-to-one)
  • 多对多(many-to-many)

第二章 Hibernate中的单向一对多关联

2-1 一对多映射简介

如:一个班级对应多个学生

  • 在数据库中,可以通过添加主外键的关联,表现一对多的关系
  • 通过在一方持有多方的集合实现,即在“一”的一端中使用元素表示持有“多”的一端的现象

2-2 hibernate的基础配置

New --> Java Project --> copy hibernate.cfg.xml --> src目录

<?xml version='1.0' encoding='utf-8'?>
<!DOCTYPE hibernate-configuration PUBLIC
"-//Hibernate/Hibernate Configuration DTD//EN"
"http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">
<hibernate-configuration>
    <session-factory>
        <property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property>
        <property name="hibernate.connection.url">
            jdbc:mysql:///hibernate?useUnicode=true&characterEncoding=utf8
        </property>
        <property name="hibernate.connection.username">root</property>
        <property name="hibernate.connection.password">123456</property>
        <property name="hibernate.dialect">org.hibernate.dialect.MySQL5Dialect</property>
        <property name="hibernate.hbm2ddl.auto">update</property>
        <property name="show_sql">true</property>
    </session-factory>
</hibernate-configuration>

2-3 创建HibernateUtil工具类

package cc.wlc.util;

import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.cfg.Configuration;

public class HibernateUtil {

    private static SessionFactory sessionFactory;
    private static Session session;

    static {
        Configuration config = new Configuration().configure();
        sessionFactory = config.buildSessionFactory();
    }

    //获取sessionFactory
    public static SessionFactory geSessionFactory() {
        return sessionFactory;
    }

    //获取session
    public static Session getSession() {
        session = sessionFactory.openSession();
        return session;
    }

    //关闭session
    public static void closeSession(Session session) {
        if(session!=null) {
            session.close();
        }
    }
}

2-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,
    sex char(2),
    gid int
);
alter table student add constraint fk_student_gid foreign key (gid) references grade(gid);

2-5 创建持久化和映射文件并配置一对多关系

Grade.hbm.xml

<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<!-- Generated 2017-10-12 10:49:12 by Hibernate Tools 3.5.0.Final -->
<hibernate-mapping>
    <class name="cc.wlc.entity.Grade" table="grade">
        <id name="gid" type="int">
            <column name="gid" />
            <generator class="increment" />
        </id>
        <property name="gname" type="java.lang.String">
            <column name="gname" length="20" not-null="true"/>
        </property>
        <property name="gdesc" type="java.lang.String">
            <column name="gdesc" />
        </property>
        <set name="students" table="student" inverse="false" lazy="true">
            <key>
                <column name="gid" />
            </key>
            <one-to-many class="cc.wlc.entity.Student" />
        </set>
    </class>
</hibernate-mapping>

Student.hbm.xml

<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<!-- Generated 2017-10-12 10:49:12 by Hibernate Tools 3.5.0.Final -->
<hibernate-mapping>
    <class name="cc.wlc.entity.Student" table="student">
        <id name="sid" type="int">
            <column name="sid" />
            <generator class="increment" />
        </id>
        <property name="sname" type="java.lang.String">
            <column name="sname" />
        </property>
        <property name="sex" type="java.lang.String">
            <column name="sex" />
        </property>
    </class>
</hibernate-mapping>

在hibernate.cfg.xml中要加上

<mapping resource="cc/wlc/entity/Grade.hbm.xml"/>
<mapping resource="cc/wlc/entity/Student.hbm.xml"/>

2-6 测试——添加和查询学生信息

//将学生添加到班级
public static void add() {
    Grade grade = new Grade("java一班","java软件开发一班");
    Student s1 = new Student("张三","男");
    Student s2 = new Student("莉莉", "女");

    //如果希望在学生表中添加对应的班级编号,需要在班级中添加学生,建立关联关系
    grade.getStudents().add(s1);
    grade.getStudents().add(s2);

    Session session = HibernateUtil.getSession();
    Transaction tx = session.beginTransaction();
    session.save(grade);
    session.save(s1);
    session.save(s2);
    tx.commit();
    HibernateUtil.closeSession(session);
}

//查询班级中包含的学生
public static void findStudentsByGrade() {
    Session session = HibernateUtil.getSession();
    Grade grade = session.get(Grade.class, 1);
    System.out.println(grade.getGname()+","+grade.getGdesc());

    Set<Student> students = grade.getStudents();
    for(Student stu:students) {
        System.out.println(stu.getSname()+","+stu.getSex());
    }
}

2-7 测试——修改和删除学生信息

//修改学生信息
public static void update() {
    Grade grade = new Grade("java二班","java软件开发二班");
    Session session = HibernateUtil.getSession();
    Transaction tx = session.beginTransaction();
    Student stu = session.get(Student.class, 1);
    grade.getStudents().add(stu);
    session.save(grade);
    tx.commit();
    HibernateUtil.closeSession(session);
}

//删除学生信息
public static void delete() {
    Session session = HibernateUtil.getSession();
    Transaction tx = session.beginTransaction();
    Student stu = session.get(Student.class, 2);
    session.delete(stu);
    tx.commit();
    HibernateUtil.closeSession(session);
}

2-8 set元素的常用属性

第三章 单向多对一关联

3-1 简介

  • 多对一的关系和关系数据库的外键参照关系最匹配,即在己方的表中的一个外键参照另一个表的主键
  • 通过在多方持有一方的引用实现,需要在“多”的一端使用配置

3-2 单向多对一的配置

在Student类中添加Grade类的引用

private Grade grade;

添加getter/setter方法

在多方的配置文件Student.hbm.xml中添加配置代码

<!-- 配置多对一关联关系 -->
<many-to-one name="grade" class="cc.wlc.entity.Grade" column="gid"></many-to-one>

3-3 测试——添加学生信息

public static void save() {
    Grade g = new Grade("java一班","java软件开发一班");
    Student stu1 = new Student("李梅","女");
    Student stu2 = new Student("小明","男");

    //设置关联关系
    stu1.setGrade(g);
    stu2.setGrade(g);

    Session session = HibernateUtil.getSession();
    Transaction tx = session.beginTransaction();
    session.save(g);
    session.save(stu1);
    session.save(stu2);
    tx.commit();
    HibernateUtil.closeSession(session);
}

3-4 双向多对一测试

//设置关联关系
g.getStudents().add(stu1);
g.getStudents().add(stu2);
stu1.setGrade(g);
stu2.setGrade(g);

第四章 inverse和cascade属性

4-1 inverse属性的用法

  • 节点的inverse属性指定关联关系的控制方向,默认由one方来维护
  • 关联关系中,inverse = "false" 则为主动方,由主动方负责维护关联关系
  • 在一对多关联中,只能设置one方的inverse为true,这将有助于性能的改善

4-2 cascade属性的用法

  • 当设置了cascade属性不为none时,Hibernate会自动持久化关联的对象
  • cascade属性的设置会带来性能上的变动,需谨慎设置
属性值 含义和作用
all 对所有操作进行级联操作
save-update 执行保存和更新操作时进行级联操作
delete 执行删除操作时进行级联操作
none 对所有操作不进行级联操作

4-3 测试——信息查询

//查询学生所在班级的信息
public static void findGradeByStudent() {
    Session session = HibernateUtil.getSession();
    Student stu = session.get(Student.class, 2);
    System.out.println(stu.getSid()+","+stu.getSname()+","+stu.getSex());

    Grade g = stu.getGrade();
    System.out.println(g.getGid()+","+g.getGname()+","+g.getGdesc());
    HibernateUtil.closeSession(session);
}

hibernate之一对多映射的更多相关文章

  1. hibernate进阶--一对多映射配置

    hibernate作为一款优秀的ORM框架,广受大家喜爱,也被Java社区公认为持久层的首选.虽然jdbc为Java数据库操 作带来了诸多便利,但是并没有统一SQL语句的写法,而且具体操作数据库的代码 ...

  2. 【hibernate】<第二节>hibernate的一对多映射(基本类型)

    所需工具与前文一致! 第一部分内容:基本类型的一对多(one to many) 以部门表与员工表为例: 目录结构: hibernate.cfg.xml内容 <?xml version=" ...

  3. hibernate(三) 一对多映射关系

    序言 前面两节讲了hibernate的两个配置文件和hello world!.还有hibernate的一级缓存和三种状态,基本上hibernate就懂一点了,从这章起开始一个很重要的知识点,hiber ...

  4. Hibernate 双向一对多映射

    附代码: public class Order { private Integer id; private String OrderName; private Customer customer; p ...

  5. Hibernate 单向一对多映射

    单向 n-1: 单向 n-1 关联只需从 n 的一段访问 1 的一端 此处 Order 类和 Customer 类,其中 Order 类需要引用 Customer 类 代码: public class ...

  6. Hibernate(六)一对多映射(多对一)

    一.Hinbernate中持久化类的关联关系 在数据库中,表表之间是通过外键关联的,在程序中是要转化为持久化类也就是(JAVA Bean)来实例的. 但在Hibernater中持久化的之间的映射关系, ...

  7. hibernate双向一对多映射

    双向多对一 :Customer类------------>一的一端   Order类----------->多的一端 Customer类:(省略set().get()和构造方法) priv ...

  8. hibernate学习(二)

    hibernate 单向一对多映射 一.数据表设计 数据库名:hibernate5 数据表: ①表名:CUSTOMERS 字段: CUSTOMER_ID  CUSTOMER_NAME ②表名:ORDE ...

  9. Hibernate制图(两)——许多-于─关系映射

    上篇学习了Hibernate的基本映射,也就是单表映射,非常easy就能理解,可是对于关系数据库来说,表之间存在关系是比不可少的.关系数据库中存在的关系是通过主外键建立起来的.反应到Hibernate ...

随机推荐

  1. yii2表单,用惯yii1的可以看一下,有很大不同哦

    使用表单 本章节将介绍如何创建一个从用户那搜集数据的表单页.该页将显示一个包含 name 输入框和 email 输入框的表单.当搜集完这两部分信息后,页面将会显示用户输入的信息. 为了实现这个目标,除 ...

  2. AcWing算法基础1.5

    前缀和与差分 两个内容都比较少,就放一起写了 设数组 a 的前 n 项为a1 , a2 , a3 ... an 前缀和数组就是每一项是a数组的前i项和,比如前缀和数组res,res[ 1 ] = a[ ...

  3. [Luogu 1312] noip11 Mayan游戏

    [Luogu 1312] noip11 Mayan游戏 Problem: Mayan puzzle是最近流行起来的一个游戏.游戏界面是一个 7 行5 列的棋盘,上面堆放着一些方块,方块不能悬空堆放,即 ...

  4. 题解报告:hdu 2188 悼念512汶川大地震遇难同胞——选拔志愿者(巴什博弈)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2188 Problem Description 对于四川同胞遭受的灾难,全国人民纷纷伸出援助之手,几乎每 ...

  5. 【Leetcode】115. Distinct Subsequences

    Description: Given two string S and T, you need to count the number of T's subsequences appeared in ...

  6. jQuery Tmpl使用

    1.引入脚本 2.编写模板 2.1假设此时有一个,从后台一json格式发送来的数据 [{"tId":1,"tName":"张三"," ...

  7. 将子节点的所有父节点ID合并成一个字符串,并更新表

    begin for cur_dept in (select SLCATALOG_ID from T_GIS_SLCATALOG) loop UPDATE T_GIS_SLCATALOG SET PAT ...

  8. 学习笔记-java IO流总结 转载

    1.什么是IO Java中I/O操作主要是指使用Java进行输入,输出操作. Java所有的I/O机制都是基于数据流进行输入输出,这些数据流表示了字符或者字节数据的流动序列.Java的I/O流提供了读 ...

  9. SSH整合框架+mysql简单的实现

    SSH整合框架+mysql简单的实现 1. 框架整合原理: struts2整合Spring 两种: 一种struts2自己创建Action,自动装配Service : 一种 将Action交给Spri ...

  10. dotnetnuke 7.x登录时不跳到站点设置中的指定页

    查源码发现登录按钮有参数,点击跳到登录页或者弹窗登录,真正登录后会根据传参的url反回.因为皮肤对像没有相应参数,所以只能去掉参数.我是用js去的,偷个懒吧.如下所示: <script type ...