三、Hibernate

關聯映射

一對多雙向關聯

  • 實體
package com.xingxue.day4.hibernate.demo1.domain;

import java.util.HashSet;
import java.util.Set;

// 一個班級對應多個老師,一個老師屬于一個班級
public class ClassModel {
    //標識字段
    private Long id;
    //業務字段
    private String cname;
    private String description;

    //關聯字段
    private Set<TeacherModel> teacherModels = new HashSet<TeacherModel>();


    public Set<TeacherModel> getTeacherModels() {
        return teacherModels;
    }

    public void setTeacherModels(Set<TeacherModel> teacherModels) {
        this.teacherModels = teacherModels;
    }

    public Long getId() {
        return id;
    }

    public void setId(Long id) {
        this.id = id;
    }

    public String getCname() {
        return cname;
    }

    public void setCname(String cname) {
        this.cname = cname;
    }

    public String getDescription() {
        return description;
    }

    public void setDescription(String description) {
        this.description = description;
    }
}
===============================================================================
package com.xingxue.day4.hibernate.demo1.domain;

public class TeacherModel {


    private Long id;
    private String tname;

    private ClassModel classModel;


    public ClassModel getClassModel() {
        return classModel;
    }

    public void setClassModel(ClassModel classModel) {
        this.classModel = classModel;
    }

    public Long getId() {
        return id;
    }

    public void setId(Long id) {
        this.id = id;
    }

    public String getTname() {
        return tname;
    }

    public void setTname(String tname) {
        this.tname = tname;
    }
}

  • 映射文件
<?xml version='1.0' encoding='utf-8'?>
<!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.xingxue.day4.hibernate.demo1.domain.TeacherModel" table="t_teacher">
        <id name="id" column="id">
            <generator class="sequence">
                <param name="sequence_name">
                    teacher_seq
                </param>
            </generator>
        </id>
        <property name="tname" column="tname"></property>
        <!--通過 many2one 描述 關系:多對一的關系
            name 屬性: 設置關聯的字段名稱
            class 屬性: 關聯的類型
                column 子標簽:設置多方的外鍵名稱
        -->
        <many-to-one name="classModel" class="com.xingxue.day4.hibernate.demo1.domain.ClassModel" column="cid"/>
    </class>

</hibernate-mapping>

===============================================================================
<?xml version='1.0' encoding='utf-8'?>
<!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.xingxue.day4.hibernate.demo1.domain.ClassModel" table="t_class">
        <id name="id" column="id">
            <generator class="sequence">
                <param name="sequence_name">
                    class_seq
                </param>
            </generator>
        </id>
        <property name="cname" column="cname"></property>
        <property name="description"></property>
        <!-- set 標簽 描述 關聯字段的 類型
                  name 屬性: 關聯字段的名稱

              inverse 屬性:就是描述是否當前實體是否放棄外鍵的維護,默認就是false,表示不放棄
                           設置為 true 表示 當前實體放棄外鍵的維護。

        -->
        <set name="teacherModels" inverse="false">
          <!--  配置多方表中的外鍵,使用 key 標簽
                        column 屬性:指定外鍵的名稱
          -->
            <key>
                <column name="cid"></column>
            </key>
           <!-- one2many 標簽 描述 關系
                    class 屬性:設置關聯的類型
           -->
            <one-to-many class="com.xingxue.day4.hibernate.demo1.domain.TeacherModel"></one-to-many>
        </set>
    </class>
</hibernate-mapping>
  • 關系維護(inverse):默認情況下,一方也可以維護外鍵的關系,多方必須維護外鍵的關系(也就是說,多方法不能設置 inverse屬性),往往 一方應該放棄外鍵的維護,因為采用一方外鍵維護,會單獨的發 update 語句去更新外鍵的值,造成多發sql 的情況。所以可以在一方的 set 標簽上設置 inverse屬性為 true 表示放棄外鍵的維護。
 <set name="teacherModels" inverse="true">
  • 關聯對象導航圖查詢以及優化(fetch)

一方 可以配置 fetch:
select(默認的):先查主表,同過主表的記錄中的id 去分別發sql 查詢關聯表數據。
join: 采用 left outter join 進行主從連接查詢,如果采用 lazy 屬性 失效。

subselect:只有在一方配置文件中才有該選項,在多方配置文件中沒有該選項,在 hql 中 查詢主表有多個記錄的時候,在查詢關聯的數據的時候,就會采用 子查詢。

多方 可以配置 fetch:

select(默認的):先查主表,同過主表的記錄中的id 去分別發sql 查詢關聯表數據。
join: 采用 left outter join 進行主從連接查詢,如果采用 lazy 屬性 失效。

  • 級聯操作 (cascade)
    cascade 屬性: 一般 delete 不要去配。
    save-update:保存當前實體,就會級聯保存關聯的實體
    delete : 刪除當前實體,級聯刪除關聯的實體
    all : save-update 和 delete
    delete-orphan:孤兒刪除,只能在 一對多關聯中使用.主表是一方,從表多方,如果從表的記錄沒有關聯主表的外鍵值,從表的該記錄可以視為是孤兒,就會刪除。
    all-delete-orphan : all delete-orphan

  • hql 關聯查詢
    迫切左外連接
    select c from ClassModel c left join fetch c.teacherModels ,發一條sql
    左外連接
    select c from ClassModel c left join c.teacherModels ,發兩條

    from ClassModel c left join c.teacherModels:返回的類型是 Object[] 類型

多對多雙向關聯

詳見代碼,注意一般來說應該放棄一方的外鍵維護

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 229,406評論 6 538
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 99,034評論 3 423
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 177,413評論 0 382
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,449評論 1 316
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 72,165評論 6 410
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 55,559評論 1 325
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,606評論 3 444
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,781評論 0 289
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 49,327評論 1 335
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 41,084評論 3 356
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 43,278評論 1 371
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,849評論 5 362
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,495評論 3 348
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,927評論 0 28
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 36,172評論 1 291
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 52,010評論 3 396
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 48,241評論 2 375

推薦閱讀更多精彩內容