首页 > 技术文章 > Hibernate的一对多和多对一的映射

shely-Wangfan 2016-05-19 16:44 原文

Hibernate的一对多和多对一的映射

单向

一到多的映射

  通过set来配置,set标签的属性有

  以学生和班级的关系为例
  在一方即班级的映射文件中可以这样配置

<set name="students" table="student">
        <key column="gid"></key>
        <one-to-many class="com.imooc.entity.Student"/>
</set>

多到一的映射


  在多方即学生的映射文件中可以这样配置 <many-to-one name="grade" class="com.imooc.entity.Grade" column="gid"> </many-to-one>

双向

  在在班级和学生的映射文件中将以上的两个配置都加入其中
  为了进一的优化属性可以在一方的set中对属性inverse进行配置即其中关于inverse的说明如下:
        inverse的默认值为false,即由一方来维护关联关系,我们将inverse的值设置为ture则变为由多方进行维护。 import java.util.HashSet;

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

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

/**
 * 
 * @author Administrator
 *单向多对一
 *学生--->班级
 */
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);//cascade="save-update"就不需要显示的保存学生了
        session.save(stu2);
        tx.commit();
        HibernateUtil.closeSession(session);

    }
}  

  对与以上的测试类,如果结果inverse的属性值为false则执行时内部的操作为为

  我们发现在插入之后还有两条更新语句,显然是不需要的,影响性能。而将inverse的属性设置为true后由多方进行维护就不会有之后的update语句结果如下:

  在测试代码中我们会发现,在保存班级session.save(g)之后还要保存学生,为了更好的提供性能我们可以在班级的映射文件中设置set的属性cascade值,首先介绍cascade这个属性

  我们可以在班级的映射文件中设值set属性cascade="save-update"则在保存和更新班级时将学生表中没有的学生插入学生表。这时不需要显示的对学生进行保存,即session.save(stu1);session.save(stu2);不再需要。
  也可以在学生的映射文件中many-to-one的属性cascade的值为cascade="all",在对学生进行增删改查的时候也对班级进行级联操作。
  最后完整的映射文件
  班级映射文件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>
        <!-- 配置一对多关联关系 ,设置inverse属性为true:多方维护关联关系;当进行保存和更新时进行级联操作所关联的对象-->
        <set name="students" table="student" inverse="true" cascade="save-update">
            <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" type="java.lang.String">
            <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>

附1:Myeclipse对Hibernate的添加支持功能

1、新建一个项目
2、在Myeclipse里打开数据库视图
点击如图所示图标

出现

点击Myeclipse Datebase Explorer

3、新建数据库连接

连接配置如下:

点击Test driver测试,点击finish完成
4.右击项目,添加Myeclipse支持

5、选择Hibernate版本

6、创建Hibernate核心配置文件和工具类

7、选择数据库连接,选择之前创建的数据库连接

8、jar包选择

附2:Myeclipse反向生成映射文件

1、创建包存储持久化类和映射文件
2、进入数据库视图
3、对表选择反向工程



4、切换为企业开发视图查看结果

附3:java数据类型和Hibernate数据类型的对应关系

 

 

 

 

推荐阅读