三、Hibernate

關(guān)聯(lián)映射

一對(duì)多雙向關(guān)聯(lián)

  • 實(shí)體
package com.xingxue.day4.hibernate.demo1.domain;

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

// 一個(gè)班級(jí)對(duì)應(yīng)多個(gè)老師,一個(gè)老師屬于一個(gè)班級(jí)
public class ClassModel {
    //標(biāo)識(shí)字段
    private Long id;
    //業(yè)務(wù)字段
    private String cname;
    private String description;

    //關(guān)聯(lián)字段
    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>
        <!--通過(guò) many2one 描述 關(guān)系:多對(duì)一的關(guān)系
            name 屬性: 設(shè)置關(guān)聯(lián)的字段名稱(chēng)
            class 屬性: 關(guān)聯(lián)的類(lèi)型
                column 子標(biāo)簽:設(shè)置多方的外鍵名稱(chēng)
        -->
        <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 標(biāo)簽 描述 關(guān)聯(lián)字段的 類(lèi)型
                  name 屬性: 關(guān)聯(lián)字段的名稱(chēng)

              inverse 屬性:就是描述是否當(dāng)前實(shí)體是否放棄外鍵的維護(hù),默認(rèn)就是false,表示不放棄
                           設(shè)置為 true 表示 當(dāng)前實(shí)體放棄外鍵的維護(hù)。

        -->
        <set name="teacherModels" inverse="false">
          <!--  配置多方表中的外鍵,使用 key 標(biāo)簽
                        column 屬性:指定外鍵的名稱(chēng)
          -->
            <key>
                <column name="cid"></column>
            </key>
           <!-- one2many 標(biāo)簽 描述 關(guān)系
                    class 屬性:設(shè)置關(guān)聯(lián)的類(lèi)型
           -->
            <one-to-many class="com.xingxue.day4.hibernate.demo1.domain.TeacherModel"></one-to-many>
        </set>
    </class>
</hibernate-mapping>
  • 關(guān)系維護(hù)(inverse):默認(rèn)情況下,一方也可以維護(hù)外鍵的關(guān)系,多方必須維護(hù)外鍵的關(guān)系(也就是說(shuō),多方法不能設(shè)置 inverse屬性),往往 一方應(yīng)該放棄外鍵的維護(hù),因?yàn)椴捎靡环酵怄I維護(hù),會(huì)單獨(dú)的發(fā) update 語(yǔ)句去更新外鍵的值,造成多發(fā)sql 的情況。所以可以在一方的 set 標(biāo)簽上設(shè)置 inverse屬性為 true 表示放棄外鍵的維護(hù)。
 <set name="teacherModels" inverse="true">
  • 關(guān)聯(lián)對(duì)象導(dǎo)航圖查詢(xún)以及優(yōu)化(fetch)

一方 可以配置 fetch:
select(默認(rèn)的):先查主表,同過(guò)主表的記錄中的id 去分別發(fā)sql 查詢(xún)關(guān)聯(lián)表數(shù)據(jù)。
join: 采用 left outter join 進(jìn)行主從連接查詢(xún),如果采用 lazy 屬性 失效。

subselect:只有在一方配置文件中才有該選項(xiàng),在多方配置文件中沒(méi)有該選項(xiàng),在 hql 中 查詢(xún)主表有多個(gè)記錄的時(shí)候,在查詢(xún)關(guān)聯(lián)的數(shù)據(jù)的時(shí)候,就會(huì)采用 子查詢(xún)。

多方 可以配置 fetch:

select(默認(rèn)的):先查主表,同過(guò)主表的記錄中的id 去分別發(fā)sql 查詢(xún)關(guān)聯(lián)表數(shù)據(jù)。
join: 采用 left outter join 進(jìn)行主從連接查詢(xún),如果采用 lazy 屬性 失效。

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

  • hql 關(guān)聯(lián)查詢(xún)
    迫切左外連接
    select c from ClassModel c left join fetch c.teacherModels ,發(fā)一條sql
    左外連接
    select c from ClassModel c left join c.teacherModels ,發(fā)兩條

    from ClassModel c left join c.teacherModels:返回的類(lèi)型是 Object[] 類(lèi)型

多對(duì)多雙向關(guān)聯(lián)

詳見(jiàn)代碼,注意一般來(lái)說(shuō)應(yīng)該放棄一方的外鍵維護(hù)

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容