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

来源:互联网 发布:网络管理的协议 编辑:程序博客网 时间:2024/05/22 06:24

映射类型(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元素进行一对多映射的配置。
这里写图片描述

0 0
原创粉丝点击