Hibernate关联映射--一对多映射

转载 2016年08月29日 21:36:49

映射类型(4种):
这里写图片描述
常见的及常用的:一对多、多对一。


一对多映射(one-to-many)
如何表示一对多的关联关系:
这里写图片描述
这里写图片描述
例子:一个班级对应多个学生。在班级中定义一个学生的集合。
在数据库中创建表student(学生表)和grade(班级表)
hibernate.cfg.xml(注意指定映射文件的路径):

<?xml version='1.0' encoding='UTF-8'?>
<!DOCTYPE hibernate-configuration PUBLIC
          "-//Hibernate/Hibernate Configuration DTD 3.0//EN"
          "http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd">
<!-- Generated by MyEclipse Hibernate Tools.                   -->
<hibernate-configuration>
    <session-factory>
        <property name="dialect">
            org.hibernate.dialect.MySQLDialect
        </property>
        <property name="connection.url">
            jdbc:mysql://localhost:3306/hibernate?useUnicode=true&amp;characterEncoding=UTF-8
        </property>
        <property name="connection.username">root</property>
        <property name="connection.password">123456</property>
        <property name="connection.driver_class">
            com.mysql.jdbc.Driver
        </property>
        <property name="myeclipse.connection.profile">mysql</property>

        <property name="show_sql">true</property>
        <property name="format_sql">true</property>
        <property name="hbm2ddl.auto">update</property>
        <property name="hibernate.current_session_context_class">thread</property>

        <!-- 指定映射文件的路径 -->
        <mapping resource="com/entity/Grade.hbm.xml" />
        <mapping resource="com/entity/Student.hbm.xml" />
    </session-factory>
</hibernate-configuration>

创建实体类student和grade(注意实现Serializable接口):

package com.entity;

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


}
package com.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 gdesc;  //班级详细信息 
    //建立一对多的关联关系:在一方(班级)定义一个多方(学生)的集合
    private Set<Student> students=new HashSet<Student>();        //set集合元素不允许重复,元素没有顺序
    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 Set<Student> getStudents() {
        return students;
    }
    public void setStudents(Set<Student> students) {
        this.students = students;
    }
    public Grade() {
        super();
        // TODO Auto-generated constructor stub
    }
    public Grade(int gid, String gname, String gdesc, Set<Student> students) {
        super();
        this.gid = gid;
        this.gname = gname;
        this.gdesc = gdesc;
        this.students = students;
    }
    public Grade(String gname, String gdesc) {
        super();
        this.gname = gname;
        this.gdesc = gdesc;
    }


}

Student.hbm.xml:

<?xml version="1.0" encoding="utf-8"?>
<!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.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" type="java.lang.String">
            <column name="sex"></column>
        </property>
    </class>  
</hibernate-mapping>

Grade.hbm.xml(注意配置单向的一对多关联关系用到Set):

<?xml version="1.0" encoding="utf-8"?>
<!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.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" type="java.lang.String">
            <column name="gdesc"></column>
        </property>
        <!-- 配置单向的一对多关联关系 -->
        <set name="students" table="student">
            <!-- 指定关联的外键列 -->
            <key column="gid"></key>
            <one-to-many class="com.entity.Student"></one-to-many>
        </set>
    </class>
</hibernate-mapping>

创建一个工具类HibernateUtil用于初始化hibernate、获取会话工厂和会话 、关闭会话:

package com.util;

import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.boot.registry.StandardServiceRegistry;
import org.hibernate.boot.registry.StandardServiceRegistryBuilder;
import org.hibernate.cfg.Configuration;

//工具类:初始化hibernate、获取会话工厂和会话 、关闭会话
public class HibernateUtil {
    private static SessionFactory sessionFactory; //会话工厂
    private static Session session;//会话

    //静态代码块
    static{ //初始化
        //创建Configuration对象,读取hibernate.cfg.xml文件,完成初始化
        Configuration config=new Configuration().configure();
        StandardServiceRegistryBuilder ssrb=new StandardServiceRegistryBuilder()
                .applySettings(config.getProperties()); //StandardServiceRegistryBuilder:hibernate4.3之后才有
        StandardServiceRegistry ssr=ssrb.build();
        sessionFactory=config.buildSessionFactory(ssr);
    }

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

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

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

测试类Test,实现增删改查:

package com.entity;

import java.util.Set;
import org.hibernate.Session;
import org.hibernate.Transaction;
import com.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); //关闭session
    }

    //查询班级中包含的学生信息
    public static void findStudentsByGrade(){
        Session session=HibernateUtil.getSession(); //获得session
        Grade grade=(Grade) session.get(Grade.class,1); //获取一个班级信息(本例查询ID为1的班级)
        System.out.println(grade.getGname()+","+grade.getGdesc());
        //得到学生集合
         Set<Student> students=grade.getStudents();
         for (Student student : students) {
            System.out.println(student.getSname()+","+student.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); //获取id为1的学生信息
        g.getStudents().add(stu);
        session.save(g);
        tx.commit(); //提交事务
        HibernateUtil.closeSession(session); //关闭session
    }

    //删除学生信息
    public static void delete(){
        Session session=HibernateUtil.getSession();  //得到会话
        Transaction tx=session.beginTransaction(); //开启事务
        //获得学生信息
        Student stu=(Student) session.get(Student.class, 2);  //获取id为2的学生信息
        //删除这个学生
        session.delete(stu);
        tx.commit();
        HibernateUtil.closeSession(session);
    }
}

执行add方法,数据库:
grade表:这里写图片描述
student表:这里写图片描述
执行查询方法,控制台:
这里写图片描述
执行update,数据库:
grade表:这里写图片描述
student表:这里写图片描述
执行delete,数据库:
grade表:这里写图片描述
student表:这里写图片描述


Set元素的常用属性:
单向的一对多映射通过在一方定义一个多方的集合。在映射文件中通过Set元素进行一对多映射的配置。
这里写图片描述

相关文章推荐

hibernate双向一对多关联映射(XML)

  • 2017年05月07日 16:21
  • 20KB
  • 下载

千山万水之Hibernate(六)——关联映射(一对多)

学习Hibernate的过程中,映射是比较重要的一部分,再说其中哪一种映射比较重要(或可以说是比较常用)呢?那一定很多人会想到一对多关联映射。之所以这样说,是因为在生活中很多这样的实例:班级-学生、企...

hibernate学习 关联映射(多对一,一对多)

一对多关联映射   映射原理   一对多关联映射和多对一关联映射的映射原理是一致的,都是在多的一端加入一个外键,指向一的一端。关联关系都是由多端维护,只是在写映射时发生了变化。   多对一关...

一口一口吃掉Hibernate(五)——一对多单向关联映射

在上一篇博客《一口一口吃掉Hibernate(四)——多对一单向关联映射》中,介绍了多对一的关联映射,今天就反过来说一下一对多的单向关联映射。       可能有人会对这2篇博客的题目有点混淆不清...

hibernate一对多关联映射—单向

一、简述 一对多关联映射(one-to-many) 1、在对象模型中,一对多的关联关系,使用集合表示 比如Classes(班级)和Student(学生)之间是一对多的关系 public cla...

Hibernate从入门到精通(九)一对多双向关联映射

上次的博文Hibernate从入门到精通(八)一对多单向关联映射中,我们讲解了一下一对多单向映射的相关内容,这次我们讲解一下一对多双向映射的相关内容。...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Hibernate关联映射--一对多映射
举报原因:
原因补充:

(最多只允许输入30个字)