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

  

相關文章
相關標籤/搜索