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

转载 2016年08月30日 21:37:03

单向多对一关联关系:
这里写图片描述
这里写图片描述
eg:多个学生属于一个班级。在一对多的例子上,我们进行一些改变来建立单向多对一映射:
在student类中增加一个grade班级属性,建立其get/set方法:

    private int sid; //学生编号
    private String sname; //学生姓名
    private String sex;  //学生性别
    //在多方定义一个一方的引用->学生属于某个班级
    private Grade grade;

修改映射文件Student.hbm.xml(注意使用many-to-one配置多对一关联关系):

<?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>
        <!-- 配置多对一关联关系 :many-to-one-->
        <many-to-one name="grade" class="com.entity.Grade" column="gid"></many-to-one>
    </class>  
</hibernate-mapping>

Grade.hbm.xml(因为是单向的多对一关系,要将Grade.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.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>

测试类Test02(先清空数据库中表的数据):

package com.entity;

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

import com.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("小木木","男"); //创建学生

        //设置关联关系,指定学生同班级的关系
        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); //关闭session
    }
}

grade表:这里写图片描述
student表:这里写图片描述


双向多对一关联关系:
双向关联关系的建立需要在双方配置关联关系
注意:在本例中,student类里面定义了grade班级属性,已经进行了关系的维护。而inverse属性用来指定关系的维护,其默认值为false,表示由‘一方’(班级)来进行维护。双方都进行了维护会使性能降低。
所以:当需要只由多方(学生)进行维护时,可将其inverse的值设置为true,由多方维护关联关系,一方不维护。
这里写图片描述
配置一对多的关联关系,Grade.hbm.xml(要设置inverse属性和cascade属性):

<?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>     
        <!-- 配置一对多关联关系 ,设置inverse属性为true,由多方维护关联关系,一方不维护(inverse用来指定关联关系的维护)-->
        <!-- cascade=save-update:在保存更新班级时自动级联操作所关联的对象(学生)的信息 -->
        <set name="students" table="student" inverse="true" cascade="save-update">  
            <!-- 指定关联的外键列  -->      
            <key column="gid"></key>   
            <one-to-many class="com.entity.Student"></one-to-many>
        </set>       
    </class>
</hibernate-mapping>

配置多对一的关联关系,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>
        <!-- 配置多对一关联关系 :many-to-one-->
        <many-to-one name="grade" class="com.entity.Grade" column="gid"></many-to-one>
    </class>  
</hibernate-mapping>

测试类Test02(增加一方对多方的关联关系):

package com.entity;

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

import com.util.HibernateUtil;

//建立双向关系
//可以由学生查找班级信息,也可由班级查找所包含的学生
public class Test02 {
    public static void main(String[] args) {
//      save();
        findGradeByStudent();
    }

    //保存学生信息
    public static void save(){
        Grade g=new Grade("Java","Java软件开发一班"); //创建一个班级
        Student stu1=new Student("穆女神","女"); //创建学生
        Student stu2=new Student("小木木","男"); //创建学生

        //增加班级对学生的一对多的关联关系
        //此时一方(班级)维护这种关系会产生两条update语句,但是这两条语句实则是多余的,可以通过inverse属性来去掉这两句话
        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);//级联操作,当保存班级时,将班级的包含的学生(这些学生当前未存储在数据库中)也存储在数据库中,而不必再手写代码进行学生存储。
        //设置cascade=save-update,在保存班级时自动级联操作所关联的学生
//      session.save(stu1);
//      session.save(stu2);
        tx.commit(); //提交事务
        HibernateUtil.closeSession(session); //关闭session
    }

    //查询学生所在班级信息
    public static void findGradeByStudent(){
        Session session=HibernateUtil.getSession(); //获得session
        Student stu=(Student) session.get(Student.class, 2);//获取id为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);

    }
}

执行save,数据库(先要清空数据库的表):
grade表:这里写图片描述
student表:这里写图片描述
执行find,控制台:
这里写图片描述

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

  • 2017年05月07日 17:13
  • 19KB
  • 下载

hibernate多对多关联映射

  • 2013年07月30日 23:53
  • 790KB
  • 下载

【Hibernate】多对多关联映射

【回顾】     上篇博客学习的是一对多单向与双向关联映射,到目前为止,就还剩下多对多关联映射没有提到。所以本篇博客内容为多对多关联映射。 【多对多】     1. 实例:用户与角色的关...

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

上次我们在中Hibernate从入门到精通(十)多对多单向关联映射讲解了一下多对多单向关联映射,这次我们讲解一下七种映射中的最后一种多对多双向关联映射。...

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

上次的博文Hibernate从入门到精通(六)一对一双向关联映射中我们介绍了一下一对一双向关联映射,本次博文我们讲解一下多对一关联映射。...

一口一口吃掉Hibernate(六)——多对多关联映射

今天来说说Hibernate中的多对多关联映射,多对多关联映射涉及到单向映射和双向映射2种。        首先举个多对多关联例子:用户User和角色Role,一个用户可以属于多个角色,一个角色可...

hibernate基于主键的双向多对多的关联映射

2、类Role 和Function类 Fole: public class Role { private int id; private String name; private Set fun...

hibernate双向多对多关联映射XML与注解版

双向多对多关联映射原理: 假设,一个员工可能有多个角色,一个角色可能有多个员工,从员工或角色的角度看,这就是多对多的关系,不管从哪一个角度看,都是多对多的联系。多对多关联映射关系一般采用中间表的形...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Hibernate关联映射--多对一映射
举报原因:
原因补充:

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