Hibernate一对多映射

 映射分四种类型:java

  一对多 多对一 一对一 多对多mysql

 

1、单向一对多sql

什么是一对多的关系呢?数据库

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

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

  1.在数据库中,能够经过添加主外键的关联,表现一对多的关系;ide

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

 

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

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

 

//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元素的经常使用属性

  

 

2、单向多对一

单向多对一关联:

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

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

 

单向多对一的配置:

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

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

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

 

3、inverse属性和cascade属性

inverse属性:

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

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

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

 

cascade属性:

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

  二、cascade属性的设置会带来性能上的变更,须要谨慎设置;

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

  属性值 含义和做用

  all 对全部操做进行级联操做

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

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

  none 对全部操做不进行级联操做

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

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

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

  

相关文章
相关标签/搜索