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".

  

 

 

 

posted @ 2018-12-05 19:38  silence丶秋枫  阅读(111)  评论(0编辑  收藏  举报