所谓一对多映射

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

而在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. 【Codeforces Round 438 A B C D 四个题】

    题目所在比赛的地址在这里呀 A. Bark to Unlock ·述大意:       输入一个目标串.然后输入n(1<=n<=100)个串,询问是否可以通过这些串收尾相接或者它本身拼出目 ...

  2. ORACLE 触发器 基础

    --触发器--语法 CREATE OR REPLACE TRIGGER TRIGGER_NAME AFTER|BEFORE|INSTEAD OF [INSERT][OR UPDATE [OF COLU ...

  3. mysql免安装版下载及配置教程

    第一步:下载 下载地址:http://dev.mysql.com/downloads/mysql/ 滚动到下方就能看到了,根据自己的需求下载: 我的电脑为64为的所以下载的为 Windows (x86 ...

  4. Debugging TensorFlow models 调试 TensorFlow 模型

    Debugging TensorFlow models Symbolic nature of TensorFlow makes it relatively more difficult to debu ...

  5. js 在iframe子页面获取父页面元素,或在父页面 获取iframe子页面的元素的几种方式

    用JS或jquery访问页面内的iframe,兼容IE/FF 注意:框架内的页面是不能跨域的! 假设有两个页面,在相同域下. index.html 文件内含有一个iframe: XML/HTML代码 ...

  6. 解决 APPARENT DEADLOCK!!! Creating emergency threads for unassigned pending tas

    报错信息:APPARENT DEADLOCK!!! Creating emergency threads for unassigned pending tasks! 在网上查了一下,大部分网友分析是c ...

  7. log4j不生成日志文件的问题

    直接看我的注解吧 注意地址的斜杠,还有地址别写什么相对地址了,这包太老了,服务器update一下兼容问题就出来了. #第一个参数定义达到什么程度就输出 第二第三....第N 定义输出的类型 #debu ...

  8. Docker常见仓库MySQL

    MySQL 基本信息 MySQL 是开源的关系数据库实现. 该仓库提供了 MySQL 各个版本的镜像,包括 5.6 系列.5.7 系列等. 使用方法 默认会在 3306 端口启动数据库. $ sudo ...

  9. 分布式一致性协议Raft原理与实例

    分布式一致性协议Raft原理与实例 1.Raft协议 1.1 Raft简介 Raft是由Stanford提出的一种更易理解的一致性算法,意在取代目前广为使用的Paxos算法.目前,在各种主流语言中都有 ...

  10. SQL Server 虚拟化(1)——虚拟化简介

    本文属于SQL Server虚拟化系列 前言: 现代系统中,虚拟化越来越普遍,如果缺乏对虚拟化工作原理的理解,那么DBA在解决性能问题比如降低资源争用.提高备份还原速度等操作时就会出现盲点.所以基于本 ...