zoukankan      html  css  js  c++  java
  • Hibernate一对多映射

     映射分四种类型:

      一对多 多对一 一对一 多对多

    一、单向一对多

    什么是一对多的关系呢?

      就像班级和学生。站在班级的角度看。班级和学生就是一对多的关系。单向的

    那怎么样实现这种关系呢?

      1.在数据库中,可以通过添加主外键的关联,表现一对多的关系;

      2.在java中,通过在一方持有多方的集合实现,即在“一”的一端中使用<set>元素表示持有“多”的一端的对象。

    ![CDATA[这里放置需要显示的字符]]>

    数据库连接URL,使用CDATA包含是为了不让解析CDATA内部的特殊符号 如"&",如果不用CDATA则用"&"来代替"&"

    //hibernate4.3的初始化用于会话的获取和关闭:
    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());
            StandardServiceRegistry ssr = ssrb.build();
            sessionFactory = config.buildSessionFactory(ssr);
        }
    
        //获取SessionFactory对象
        public static SessionFactory getsessionFactory() {
            return sessionFactory;
        }
    
        //获取Session对象
        public static Session getSession() {
            return sessionFactory.openSession();
        }
    
        //关闭Session对象
        public static void closeSession(Session session) {
            if (session != null) {
                session.close();
            }
        }
    }
    hibernate4.3的初始化用于会话的获取和关闭
    CREATE TABLE grade
    (
        gid INT PRIMARY KEY,
        gname VARCHAR(20) NOT NULL,
        gdesc VARCHAR(50)
    );
    
    CREATE TABLE student
    (
        sid INT PRIMARY KEY,
        sname VARCHAR(20) NOT NULL,
        sex CHAR(2),
        gid INT
    );
    ALTER TABLE student ADD CONSTRAINT fk_student_gid FOREIGN KEY (gid) REFERENCES grade(gid);
    在mysql中建立一对多映射的表

     创建持久化类和映射文件并配置单向一对多关系

    a.持久化类

      1.创建学生持久化类

      2.创建班级持久化类(在一方定义一个多方集合)

    b.配置映射文件

    <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" not-null="true" length="20"></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>
      </set>
    </class>
    班级映射文件
    <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" not-null="true" length="20"></column>
      </property>
      <property name="sex">
        <column name="sex"></column>
      </property>
    </class>
    学生映射文件

     c.在hibernate.cfg.xml中配置

      <!-- 指定映射文件 -->

      <mapping resource="com/entity/Grade.hbm.xml"></mapping>

      <mapping resource="com/entity/Student.hbm.xml"></mapping>

     映射文件中set元素的常用属性

      

    二、单向多对一

    单向多对一关联:

      1、多对一的关系和关系数据库中的外键参照关系最匹配,即在己方(多方)的表中的一个外键参照另一个表的主键;

      2、通过在多方持有一方的引用实现,需要在“多”的一端使用<many-to-one>配置

    单向多对一的配置:

      1、在多方定义一方的引用 添加属性 private Grade grade; 添加get、set方法

      2、在多方持久类的映射文件中添加 <many-to-one class name="指定对一方的引用,实际上就是一方引用定义的属性" class="一方对应的持久化类,即关联实体类,全类名" cloumn="外键的列名" ></many-to-one>

      (注意:无需在一方添加关联映射,即set元素)

    三、inverse属性和cascade属性

    inverse属性:

      1、一方的hbm.xml文件的<set>节点的inverse属性指定了关联关系的控制方向,默认由one方来维护;

      2、关联关系中,inverse="false"则为主动方,由主动方负责维护关联关系;

      3、在一对多关联中,设置one方的inverse为true,这将有助于性能的改善。

    cascade属性:

      1、当设置了cascade属性不为none时,Hibernate会自动持久化所关联的对象;

      2、cascade属性的设置会带来性能上的变动,需要谨慎设置;

      ————————————————————————————

      属性值 含义和作用

      all 对所有操作进行级联操作

      save-update 执行保存和更新操作时进行级联操作

      delete 执行删除时进行级联操作

      none 对所有操作不进行级联操作

      ————————————————

    说明:举个例子,见截图:

      在向Grade添加Student后,保存Grade对象时,能不能不需要显示的保存Student对象,答案是可以的,可以使用级联操作:在Grade的映射文件中的<set>节点添加cascade属性不为none,为"save-update".

      

  • 相关阅读:
    【大话设计模式】——浅谈设计模式基础
    mongodb入门安装
    Unity3D研究之多语言用中文做KEY
    java7新特性之Try-with-resources (TWR)
    ORACLE取周、月、季、年的開始时间和结束时间
    topas命令详解
    topas解析(AIX)
    top(topas),vmstat,iostat在linux和AIX操作系统下显示情况
    怎么检查网站的死链接呢?
    网站死链接检测查询工具
  • 原文地址:https://www.cnblogs.com/silence-maple/p/10072900.html
Copyright © 2011-2022 走看看