所谓一对多映射

在数据库中我们通常会通过添加外键的方式将表关联起来,表现一对多的关系。

而在Hibernate中,我们则要通过在一方持有多方的集合来实现,即在“一”的一端中使用元素表示持有“多”的一段的对象。

下面是针对这个知识点的一个小案例:

Grade.java:

    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 gdesc;
        private Set<Student> students;

        public int getGid() {
            return gid;
        }

        public void setGid(int gid) {
            this.gid = gid;
        }

        public String getGname() {
            return gname;
        }

        public void setGname(String gname) {
            this.gname = gname;
        }

        public String getGdesc() {
            return gdesc;
        }

        public void setGdesc(String gdesc) {
            this.gdesc = gdesc;
        }

        public Grade() {
            super();
        }

        public Set<Student> getStudents() {
            return students;
        }

        public void setStudents(Set<Student> students) {
            this.students = students;
        }

        public Grade(int gid, String gname, String gdesc) {
            super();
            this.gid = gid;
            this.gname = gname;
            this.gdesc = gdesc;
        }

        public Grade(String gname, String gdesc) {
            super();
            this.gname = gname;
            this.gdesc = gdesc;
        }

    }

Student.java:

    import java.io.Serializable;

    public class Student implements Serializable {
        private int sid;
        private String sname;
        private String sex;

        public int getSid() {
            return sid;
        }

        public void setSid(int sid) {
            this.sid = sid;
        }

        public String getSname() {
            return sname;
        }

        public void setSname(String sname) {
            this.sname = sname;
        }

        public String getSex() {
            return sex;
        }

        public void setSex(String sex) {
            this.sex = sex;
        }

        public Student() {
            super();
        }

        public Student(String sname, String sex) {
            super();
            this.sname = sname;
            this.sex = sex;
        }

    }

然后是hbm.xml文件的配置:

Grade.hbm.xml:

    <?xml version="1.0"?>
    <!DOCTYPE hibernate-mapping PUBLIC
        "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
        "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
    <hibernate-mapping>
        <class name="com.imooc.entity.Grade" table="grade">
            <id name="gid" column="gid" type="java.lang.Integer">
                <generator class="increment"></generator>
            </id>
            <property name="gname" type="java.lang.String">
                <column name="gname" length="20" not-null="true"></column>
            </property>
            <property name="gdesc">
                <column name="gdesc"></column>
            </property>
            <!-- 配置一对多关联关系 -->
            <set name="students" table="student">
                <key column="gid"></key>
                <one-to-many class="com.imooc.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://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
    <hibernate-mapping>
        <class name="com.imooc.entity.Student" table="student">
            <id name="sid" column="sid" type="java.lang.Integer">
                <generator class="increment"></generator>
            </id>
            <property name="sname" type="java.lang.String">
                <column name="sname" length="20" not-null="true"></column>
            </property>
            <property name="sex">
                <column name="sex"></column>
            </property>
        </class>
    </hibernate-mapping>

最后,在hibernate.cfg.xml文件中将映射声明一下即可:

    <mapping resource="com./xx/Grade.hbm.xml" />
    <mapping resource="com/XX/Student.hbm.xml" />

代码实现操作的结果:

    import java.util.Set;

    import org.hibernate.Session;
    import org.hibernate.Transaction;

    import com.imooc.entity.Grade;
    import com.imooc.entity.Student;
    import com.imooc.util.HibernateUtil;

    /*
     * 单向一对多关系关系(班级--->学生)
     * 建立关联关系后,可以方便的从一个对象导航到另一个对象
     * 注意关联的方向
     */
    public class Test {
        public static void main(String[] args) {
            //add();
            //findStudentsByGrade();
            //update();
            delete();

        }

        //将学生添加到班级
        public static void add(){
            Grade g=new Grade("Java一班", "Java软件开发一班");
            Student stu1=new Student("张三", "男");
            Student stu2=new Student("穆女神", "女");

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

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

        //查询班级中包含的学生
        public static void findStudentsByGrade(){
            Session session=HibernateUtil.getSession();
            Grade 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());
            }*/
        }

        //修改学生信息
        public static void update(){
            Grade g=new Grade("Java二班", "Java软件开发二班");

            Session session=HibernateUtil.getSession();
            Transaction tx=session.beginTransaction();
            Student stu=(Student) session.get(Student.class, 1);
            //g.getStudents().add(stu);
            session.save(g);
            tx.commit();
            HibernateUtil.closeSession(session);
        }

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

所谓单向多对一映射

多对一的关系和关系型数据库的外键参照关系最为匹配,即在乙方的表中的一个外键参照另一个表中的主键。 而在Hibernate中就可以通过

在多方持有乙方的引用来实现,需要在“多”的一段使用标签来进行设置。

下面是针对这个知识点的一个小案例:

Grade.java:

    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 gdesc;

        public int getGid() {
            return gid;
        }

        public void setGid(int gid) {
            this.gid = gid;
        }

        public String getGname() {
            return gname;
        }

        public void setGname(String gname) {
            this.gname = gname;
        }

        public String getGdesc() {
            return gdesc;
        }

        public void setGdesc(String gdesc) {
            this.gdesc = gdesc;
        }

        public Grade() {
            super();
        }

        public Grade(int gid, String gname, String gdesc) {
            super();
            this.gid = gid;
            this.gname = gname;
            this.gdesc = gdesc;
        }

        public Grade(String gname, String gdesc) {
            super();
            this.gname = gname;
            this.gdesc = gdesc;
        }

    }

Student.java:

    import java.io.Serializable;

    public class Student implements Serializable {
        private int sid;
        private String sname;
        private String sex;
        // 在多方定义一个一方的引用
        private Grade grade;

        public Grade getGrade() {
            return grade;
        }

        public void setGrade(Grade grade) {
            this.grade = grade;
        }

        public int getSid() {
            return sid;
        }

        public void setSid(int sid) {
            this.sid = sid;
        }

        public String getSname() {
            return sname;
        }

        public void setSname(String sname) {
            this.sname = sname;
        }

        public String getSex() {
            return sex;
        }

        public void setSex(String sex) {
            this.sex = sex;
        }

        public Student() {
            super();
        }

        public Student(String sname, String sex) {
            super();
            this.sname = sname;
            this.sex = sex;
        }

    }

然后是hbm.xml文件的配置:

Grade.hbm.xml:

    <?xml version="1.0"?>
    <!DOCTYPE hibernate-mapping PUBLIC
        "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
        "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
    <hibernate-mapping>
        <class name="com.imooc.entity.Grade" table="grade">
            <id name="gid" column="gid" type="java.lang.Integer">
                <generator class="increment"></generator>
            </id>
            <property name="gname" type="java.lang.String">
                <column name="gname" length="20" not-null="true"></column>
            </property>
            <property name="gdesc">
                <column name="gdesc"></column>
            </property>
        </class>
    </hibernate-mapping>

Student.hbm.xml:

    <?xml version="1.0"?>
    <!DOCTYPE hibernate-mapping PUBLIC
        "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
        "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
    <hibernate-mapping>
        <class name="com.imooc.entity.Student" table="student">
            <id name="sid" column="sid" type="java.lang.Integer">
                <generator class="increment"></generator>
            </id>
            <property name="sname" type="java.lang.String">
                <column name="sname" length="20" not-null="true"></column>
            </property>
            <property name="sex">
                <column name="sex"></column>
            </property>
            <!-- 配置多对一关联关系 -->
            <many-to-one name="grade"
        class="com.imooc.entity.Grade" column="gid" cascade="all"></many-to-one>
        </class>
    </hibernate-mapping>

最后,在hibernate.cfg.xml文件中将映射声明一下即可:

    <mapping resource="com./xx/Grade.hbm.xml" />
    <mapping resource="com/XX/Student.hbm.xml" />

再来使用代码测试一下:

    import org.hibernate.Session;
import org.hibernate.Transaction;

import com.imooc.entity.Grade;
import com.imooc.entity.Student;
import com.imooc.util.HibernateUtil;

/*
 * 单向多对一(学生--->班级)
 */
public class Test02 {
    public static void main(String[] args) {
        save();
    }

    //保存
    public static void save(){
        Grade g=new Grade("Java一班","Java软件开发一班");
        Student stu1=new Student("慕女神", "女");
        Student stu2=new Student("小慕慕", "男");

        //设置关联关系
        g.getStudents().add(stu1);
        g.getStudents().add(stu2);
        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);
    }
}

双向的多对一关系

只需要分别在其.hbm.xml文件中进行相关的声明就可以了。

Grade.hbm.xml文件中添加:

    <!-- 配置一对多关联关系 -->
    <set name="students" table="student">
        <key column="gid"></key>
        <one-to-many class="com.imooc.entity.Student"/>
    </set>

Student.hbm.xml文件中添加:

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

由此,便可完成多对一关系的映射了!

Hibernate超简单多表操作的更多相关文章

  1. (转)Hibernate中的多表操作

    http://blog.csdn.net/yerenyuan_pku/article/details/70556208 Hibernate中的多表操作 在实际开发中,我们不可能只是简简单单地去操作单表 ...

  2. Hibernate框架笔记03表操作多对多配置

    目录 1. 数据库表与表之间的关系 1.1 一对多关系 1.2 多对多关系 1.3 一对一关系[了解] 2. Hibernate的一对多关联映射 2.1 创建一个项目,引入相关jar包 2.2. 创建 ...

  3. 【SSH三大框架】Hibernate基础第五篇:利用Hibernate完毕简单的CRUD操作

    这里利用Hibernate操作数据库完毕简单的CRUD操作. 首先,我们须要先写一个javabean: package cn.itcast.domain; import java.util.Date; ...

  4. python爬取信息到数据库与mysql简单的表操作

    python 爬取豆瓣top250并导入到mysql数据库中 import pymysql import requests import re url='https://movie.douban.co ...

  5. mysql分表场景分析与简单分表操作

    为什么要分表 首先要知道什么情况下,才需要分表个人觉得单表记录条数达到百万到千万级别时就要使用分表了,分表的目的就在于此,减小数据库的负担,缩短查询时间. 表分割有两种方式: 1水平分割:根据一列或多 ...

  6. (十五)Hibernate中的多表操作(5):双向多对多

    Hibernate的双向关联. 对象之间可以相互读取.        双向只针对读取的操作.对于增.删除.改的操作没有任何影响. 案例 : 实现双向多对多 MenuBean.java package ...

  7. (十一)Hibernate中的多表操作(1):单向一对多

    一.单向一对多() 案例一(用XML文件配置): 一个班级有多个学生,班级可以查看所有学生的信息. ClassBean.java package bean; import java.util.Hash ...

  8. (十二)Hibernate中的多表操作(2):单向多对一

    由“多”方可知“一”方的信息,比如多个员工使用同一栋公寓,员工可以知道公寓的信息,而公寓无法知道员工的信息. 案例一:使用xml配置 pojo类 Group.java package bean; // ...

  9. Hibernate 系列教程3-单表操作

    工程截图 hibernate.cfg.xml <!DOCTYPE hibernate-configuration PUBLIC "-//Hibernate/Hibernate Conf ...

随机推荐

  1. Java利用Apache POI将数据库数据导出为excel

    将数据库中的数据导出为excel文件,供其他人查看 public class POITest { public static void main(String[] args) { POITest te ...

  2. Hash算法入门指南(聊点不一样的算法人生)

    前言 很多人到现在为止都总是问我算法该怎么学啊,数据结构好难啊怎么的,学习难度被莫名的夸大了,其实不然.对于一个学计算机相关专业的人都知道,数据结构是大学的一门必修课,数据结构与算法是基础,却常常容易 ...

  3. typedef的基本用法

    1. 四个用途 用途一: 定义一种类型的别名,而不只是简单的宏替换.可以用作同时声明指针型的多个对象.比如: char* pa, pb; // 这多数不符合我们的意图,它只声明了一个指向字符变量的指针 ...

  4. PostgreSQL 中如何实现group_concat

    之前在MySQL中使用group_concat,觉得超级好用. 今天在PostgreSQL需要用到这样的场景,就去学习了一下. 在PostgreSQL中提供了arr_agg的函数来实现聚合,不过返回的 ...

  5. Go 语言环境安装

    Go 语言支持以下系统: Linux FreeBSD Mac OS X(也称为 Darwin) Window 安装包下载地址为:https://golang.org/dl/. 各个系统对应的包名: 操 ...

  6. PHP 表单 - 必需字段

    PHP - 必需字段 在上一章节我们已经介绍了表的验证规则,我们可以看到"Name", "E-mail", 和 "Gender" 字段是必须 ...

  7. Python3 多线程

    多线程类似于同时执行多个不同程序,多线程运行有如下优点: 使用线程可以把占据长时间的程序中的任务放到后台去处理. 用户界面可以更加吸引人,这样比如用户点击了一个按钮去触发某些事件的处理,可以弹出一个进 ...

  8. 论文答辩ppt要怎么写

    1.总体原则: 字大.字少.图多.要有重点 字体建议:正文要用黑体(如微软雅黑),标题可使用宋体或者黑体(如微软雅黑) 2. 主要分为两大部分: 2.1系统介绍 系统概述:概述自己系统主要是做了些什么 ...

  9. Mybatis 批量插入、批量更新

            合理的使用批量插入.更新对性能优化有很大的作用,速度明显快了N倍.         要注意数据库连接串后面要新增:&allowMultiQueries=true,表示一个sql ...

  10. springMVC源码分析--ControllerClassNameHandlerMapping(九)

    在上一篇博客springMVC源码分析--AbstractControllerUrlHandlerMapping(六)中我们介绍到AbstractControllerUrlHandlerMapping ...