Hibernate 的應(yīng)用3 —— 集合屬性的操作和關(guān)聯(lián)映射

Hibernate對(duì)集合屬性的操作

  • 持久化對(duì)象的映射集合屬性:Set List Collection Map SortedSet SortedMap 數(shù)組

  • 集合屬性對(duì)應(yīng)的元素有 set list (bag idbag) map set map array

  • 集合屬性默認(rèn)采用懶加載

  • 集合屬性被從一個(gè)持久化對(duì)象傳遞到另一個(gè)持久化對(duì)象棚潦,集合元素對(duì)應(yīng)的記錄會(huì)從一個(gè)表轉(zhuǎn)移到另一個(gè)表

  • 兩個(gè)持久化對(duì)象不能共享同一個(gè)集合元素的引用

  • 映射索引列元素有:list-index / map-key / map-key-many-to-many / composite-map-key

  • 映射集合元素的元素有:element / composite-element / one-to-many / many-to-many

  • Set集合屬性操作

    <set name="hobby" table="hobby_tab">
        <key column="student_id"></key>
        <element type="string" column="hobby"></element>
    </set>
    
  • List集合屬性操作

    <list name="hobby" table="hobby_tab_list">
        <key column="student_id"></key>
        <list-index column="position"></list-index>
        <element type="string" column="hobby"></element>
    </list>
    
  • Collection集合屬性操作

    private Collection<String> hobby;
    
    <idbag name="hobby" table="hobby_tab_c">
        <collection-id type="string" column="hobby_id">
            <generator class="uuid"></generator>
        </collection-id>
        <key column="student_id"></key>
        <element type="string" column="hobby"></element>
    </idbag>
    
  • Map集合屬性操作

    <map name="hobby" table="stu_map_hobby">
        <key column="student_id"></key>
        <map-key column="keycolumn" type="string"></map-key>
        <element type="string" column="hobby"></element>
    </map>
    

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

Hibernate 關(guān)系映射 總結(jié)整理

  • 1 to 1

    • 基于外鍵的單向 1 to 1
      public class Account {
      
          private Integer id;
          private String name;
          
          //主控端引用被控端的對(duì)象
          private Address address;
      }
      public class Address {
      
          private int id;
          private String address;
      }
      Account.hbm.xml:
      // 基于外鍵的單向一對(duì)一實(shí)際上是多對(duì)一關(guān)聯(lián)映射的特例
      
      // 采用<many-to-one>標(biāo)簽绕沈,指定多的一端的unique=true,這樣就限制了多端的多重性為一
      
      <many-to-one name="address" column="address_id" unique="true"></many-to-one>
      
    • 基于外鍵的雙向 1 to 1
      public class Account {
      
          private Integer id;
          private String name;
          
          //主控端引用被控端的對(duì)象
          private Address address_id;
      }
      public class Address {
      
          private int id;
          private String address;
          
          //聲明一個(gè)對(duì)主控端對(duì)象的引用
          private Account account;
      }
      Account.hbm.xml:
      <many-to-one name="address_id" column="address_id" unique="true"></many-to-one>
      Address.hbm.xml:
      // 基于外鍵的雙向一對(duì)一關(guān)聯(lián)映射需要在一端添加<one-to-one>標(biāo)簽,用property-ref來(lái)指定反向?qū)傩砸?<one-to-one name="account" property-ref="address_id"></one-to-one>
      
    • 基于主鍵的單向 1 to 1
      public class IDCard {
      
          private Integer id;
          private String no;
          
          //主控端引用被控端的對(duì)象
          
          private Citizen citizen;
      }
      public class Citizen {
      
          private int id;
          private String name;
      }
      IDCard.hbm.xml:
      <!-- 
          constrained 告訴當(dāng)前主鍵灶伊,你的值時(shí)采用另個(gè)表中的主鍵的值
          當(dāng)前主鍵對(duì)于有關(guān)系的另一個(gè)表來(lái)說(shuō)就是外鍵弥鹦。
       -->
      <one-to-one name="citizen" constrained="true"></one-to-one>
      
    • 基于主鍵的雙向 1 to 1
      public class IDCard {
      
          private Integer id;
          private String no;
          
          //主控端引用被控端的對(duì)象
          
          private Citizen citizen;
      }
      public class Citizen {
      
          private int id;
          private String name;
          
          private IDCard idCard;
      }
      IDCard.hbm.xml:
      <one-to-one name="citizen" constrained="true"></one-to-one>
      Citizen.hbm.xml:
      <!-- 建立一對(duì)一關(guān)系 -->
      <one-to-one name="idCard" />
      
  • 單向 1 to many

    單向一對(duì)多關(guān)聯(lián)映射亲配,在對(duì)象關(guān)系映射文件中使用<one-to-many>標(biāo)簽映射,開(kāi)發(fā)中不常見(jiàn)
    
    在數(shù)據(jù)庫(kù)中表的關(guān)系為:多端有一個(gè)字段為外鍵指向一端
    
    public class Account {
    
        private int id;
        private String accName;
        
        //對(duì)多端對(duì)象集合的引用
        private Set<Orders> setOrders;
    }
    public class Orders {
    
        private int id;
        private String orderNum;
        private Date orderTime;
    }
    Account.hbm.xml:
    <set name="setOrders">
        <key column="acc_id"></key>
        
        <one-to-many class="com.jikexueyuan.entity.Orders"/>
    </set>
    
  • 單向 many to 1

    單向多對(duì)一關(guān)聯(lián)中對(duì)象模型中類(lèi)之間的引用在關(guān)系模型中表示為表之間的外鍵引用惶凝,通過(guò)<many-to-one>標(biāo)簽映射多對(duì)一關(guān)聯(lián)
    
    // 少的一端
    public class Dept {
    
        private int id;
        private String deptName;
    }
    // 多的一端
    public class Employee {
    
        private int id;
        private String empName;
        private Date hiredate;
        //對(duì)一端的引用
        private Dept dept;
    }
    Employee.hbm.xml:
    <many-to-one name="dept" column="dept_id"></many-to-one>
    
  • 雙向 1 to many ( many to 1 )

    public class Account {
    
        private int id;
        private String accName;
        
        //對(duì)多端對(duì)象集合的引用
        private Set<Orders> setOrders;
    }
    public class Orders {
    
        private int id;
        private String orderNum;
        private Date orderTime;
        
        private Account account;
    }
    Account.hbm.xml:
    <set name="setOrders" cascade="all" inverse="true">
        <key column="acc_id"></key>
        <one-to-many class="com.jikexueyuan.entity.Orders"/>
    </set>
    Orders.hbm.xml:
    <many-to-one name="account" column="acc_id"></many-to-one>
    
    • 雙向 1 to many ( many to 1 ) 自身關(guān)聯(lián)
      public class Category {
      
          private int id;
          private String name;
          
          //如果把Category看成是多的一端
          private Category parent;
          
          //如果把Category看成是少的一端,則需要對(duì)多的一端進(jìn)行對(duì)象集合的引用
          private Set<Category> clist;
      }
      Category.hbm.xml:
      <set name="clist" inverse="true">
          <key column="parent_id"></key>
          <!-- 配置一對(duì)多的關(guān)聯(lián)映射 -->
          <one-to-many class="com.jikexueyuan.entity.Category"/>
      </set>
      <many-to-one name="parent" column="parent_id"></many-to-one>
      
  • many to many

    在關(guān)系模型中,無(wú)法直接表達(dá)兩個(gè)表之間的多對(duì)多關(guān)系犬钢。需要?jiǎng)?chuàng)建一個(gè)連接表苍鲜,它同時(shí)參照兩個(gè)表
    
    public class Course {
    
        private int id;
        private String name;
        
        //對(duì)學(xué)生集合的引用
        private Set<Student> stuList;
    }
    public class Student {
    
        private int id;
        private String name;
        private String gender;
        
        //對(duì)課程集合的引用
        private Set<Course> courseList;
    }
    Course.hbm.xml:
    <set name="stuList" table="stu_course01">
        <key column="course_id"></key>
        <many-to-many column="student_id" class="com.jikexueyuan.entity1.Student"></many-to-many>
    </set>
    Student.hbm.xml:
    <set name="courseList" table="stu_course01">
        <key column="student_id"></key>
        
        <many-to-many column="course_id" class="com.jikexueyuan.entity1.Course"></many-to-many>
    </set>
    
    分別進(jìn)行 雙向 1 to many ( many to 1 ) 
    
    public class Course02 {
    
        private int id;
        private String name;
        
        //對(duì)學(xué)生集合的引用
        private Set<StuCourse02> stuList;
    }
    public class Student02 {
    
        private int id;
        private String name;
        private String gender;
        
        //對(duì)課程集合的引用
        private Set<StuCourse02> courseList;
    }
    // 學(xué)生和課程的關(guān)系實(shí)體
    public class StuCourse02 {
    
        private int id;
        private double score;
        
        private Student02 stu;
        private Course02 course;
    }
    Course02.hbm.xml:
    <set name="stuList">
        <key column="course_id"></key>
        <one-to-many class="com.jikexueyuan.entity2.StuCourse02"/>
    </set>
    Student02.hbm.xml:
    <set name="courseList">
        <key column="student_id"></key>
        <one-to-many class="com.jikexueyuan.entity2.StuCourse02"/>
    </set>
    StuCourse02.hbm.xml:
    <many-to-one  name="stu"  column="student_id"/>
    <many-to-one name="course"  column="course_id"/>
    
  • Hibernate中關(guān)聯(lián)映射的最佳實(shí)踐

    • 為每個(gè)持久實(shí)體類(lèi)寫(xiě)一個(gè)映射文件
    • 不要用怪異的連接映射
    • 偏愛(ài)雙向關(guān)聯(lián)
  • 詳解Hibernate中cascade與inverse

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市玷犹,隨后出現(xiàn)的幾起案子混滔,更是在濱河造成了極大的恐慌,老刑警劉巖歹颓,帶你破解...
    沈念sama閱讀 206,839評(píng)論 6 482
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件坯屿,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡巍扛,警方通過(guò)查閱死者的電腦和手機(jī)领跛,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,543評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門(mén),熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)撤奸,“玉大人吠昭,你說(shuō)我怎么就攤上這事‰使希” “怎么了矢棚?”我有些...
    開(kāi)封第一講書(shū)人閱讀 153,116評(píng)論 0 344
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)府喳。 經(jīng)常有香客問(wèn)我蒲肋,道長(zhǎng),這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 55,371評(píng)論 1 279
  • 正文 為了忘掉前任兜粘,我火速辦了婚禮申窘,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘妹沙。我一直安慰自己偶洋,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,384評(píng)論 5 374
  • 文/花漫 我一把揭開(kāi)白布距糖。 她就那樣靜靜地躺著玄窝,像睡著了一般。 火紅的嫁衣襯著肌膚如雪悍引。 梳的紋絲不亂的頭發(fā)上恩脂,一...
    開(kāi)封第一講書(shū)人閱讀 49,111評(píng)論 1 285
  • 那天,我揣著相機(jī)與錄音趣斤,去河邊找鬼俩块。 笑死,一個(gè)胖子當(dāng)著我的面吹牛浓领,可吹牛的內(nèi)容都是我干的玉凯。 我是一名探鬼主播,決...
    沈念sama閱讀 38,416評(píng)論 3 400
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼联贩,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼漫仆!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起泪幌,我...
    開(kāi)封第一講書(shū)人閱讀 37,053評(píng)論 0 259
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤盲厌,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后祸泪,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體吗浩,經(jīng)...
    沈念sama閱讀 43,558評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,007評(píng)論 2 325
  • 正文 我和宋清朗相戀三年没隘,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了懂扼。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,117評(píng)論 1 334
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡升略,死狀恐怖微王,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情品嚣,我是刑警寧澤炕倘,帶...
    沈念sama閱讀 33,756評(píng)論 4 324
  • 正文 年R本政府宣布,位于F島的核電站翰撑,受9級(jí)特大地震影響罩旋,放射性物質(zhì)發(fā)生泄漏啊央。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,324評(píng)論 3 307
  • 文/蒙蒙 一涨醋、第九天 我趴在偏房一處隱蔽的房頂上張望瓜饥。 院中可真熱鬧,春花似錦浴骂、人聲如沸乓土。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,315評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)趣苏。三九已至,卻和暖如春梯轻,著一層夾襖步出監(jiān)牢的瞬間食磕,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 31,539評(píng)論 1 262
  • 我被黑心中介騙來(lái)泰國(guó)打工喳挑, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留彬伦,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 45,578評(píng)論 2 355
  • 正文 我出身青樓伊诵,卻偏偏與公主長(zhǎng)得像单绑,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子曹宴,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,877評(píng)論 2 345

推薦閱讀更多精彩內(nèi)容

  • Spring Cloud為開(kāi)發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見(jiàn)模式的工具(例如配置管理询张,服務(wù)發(fā)現(xiàn),斷路器浙炼,智...
    卡卡羅2017閱讀 134,600評(píng)論 18 139
  • 集合映射 開(kāi)發(fā)流程:需求分析/數(shù)據(jù)庫(kù)設(shè)計(jì)、項(xiàng)目設(shè)計(jì)/ 編碼/測(cè)試/實(shí)施部署上線/驗(yàn)收 需求 : 用戶(hù)購(gòu)買(mǎi)唯袄, 填寫(xiě)地...
    奮斗的老王閱讀 907評(píng)論 0 51
  • 1. Java基礎(chǔ)部分 基礎(chǔ)部分的順序:基本語(yǔ)法弯屈,類(lèi)相關(guān)的語(yǔ)法,內(nèi)部類(lèi)的語(yǔ)法恋拷,繼承相關(guān)的語(yǔ)法资厉,異常的語(yǔ)法,線程的語(yǔ)...
    子非魚(yú)_t_閱讀 31,587評(píng)論 18 399
  • 本文包括:1蔬顾、一對(duì)多結(jié)構(gòu)的準(zhǔn)備2宴偿、雙向關(guān)聯(lián)與單向關(guān)聯(lián)3、級(jí)聯(lián)保存4诀豁、級(jí)聯(lián)刪除5窄刘、cascade 屬性——級(jí)聯(lián)6、i...
    廖少少閱讀 1,222評(píng)論 1 6
  • 我2017年的目標(biāo)是創(chuàng)造豐盛舷胜,用副業(yè)使得年收入增加3萬(wàn)元娩践,其中一萬(wàn)元用于一對(duì)一公益捐助貧苦學(xué)生;成熟的良好的溝通,...
    糖雪球球2閱讀 133評(píng)論 0 1