甜咖啡

          我的IT空間

          hibernate關(guān)聯(lián)映射之逐步分析

          一對(duì)一關(guān)聯(lián)映射(單雙向)


          1 單向

          主要是配置文件上的標(biāo)簽配置
          比如對(duì)于person和idcard兩個(gè)pojo類。
          Person持有idcard的引用。在person.hbm.xml里,person的主鍵要來(lái)源于idcard類,也就是共享idcard的

          主鍵。配置:<id name= "id">
          <generator class="foreign(而不是原來(lái)的native)">
          <param name="property(必須是這個(gè))">idcard(用來(lái)關(guān)聯(lián)到person類的idcard屬性)</param>
          </generator>
          </id>
          另外主要配置<one-to-one>標(biāo)簽,此標(biāo)簽的作用是指示hibernate怎么加載它的關(guān)聯(lián)對(duì)象,默認(rèn)根據(jù)主鍵加

          載.
          標(biāo)簽name屬性是通過(guò)person類的idcard,關(guān)聯(lián)到idcard類.
          Constrained屬性主要聲明是外鍵約束.
          <one-to-one name="idcard" constrained ="true">


          2 雙向
          雙向基本上是從單向演化而來(lái).person.hbm.xml不變,在idcard.java里添加person引用,
          在idcard.hbm.xml里加入<one-to-one>標(biāo)簽.
          <one-to-one name="person"/>

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


          1 單向

          多對(duì)一及其簡(jiǎn)單.
          比如兩個(gè)類,user和group.user為多的一方,group為一的一方,只要多的一方在類中持有一的一方的引用,

          并且配置文件即user.hbm.xml里加入
          <many-to-one name="group" column="groupid"/>
          只這一句話便能建立起單向多對(duì)一關(guān)聯(lián)映射.
          但是,存儲(chǔ)的時(shí)候要注意,先存一的一方,再存多的一方.
          如果想讓hibernate自動(dòng)幫我們存儲(chǔ)一的一方,那么就要修改上面的那句話:
          <many-to-one name="group" column="groupid" cascade="all"/>
          Cascade的意思是級(jí)聯(lián)操作.有"all,save-update,delete,none",默認(rèn)為none.
          即如果要修改多的一方,那hibernate要先把一的一方改了.
          這樣我們只操作多的一方的增刪查改就行了.

          2 雙向

          看下面的一對(duì)多就知道,多對(duì)一和一對(duì)多是相對(duì)立的.
          一對(duì)多關(guān)聯(lián)映射利用了多對(duì)一關(guān)聯(lián)映射原理

          多對(duì)一關(guān)聯(lián)映射:在多的一端加入一個(gè)外鍵指向一的一端,它維護(hù)的關(guān)系是多指向一
          一對(duì)多關(guān)聯(lián)映射:在多的一端加入一個(gè)外鍵指向一的一端,它維護(hù)的關(guān)系是一指向多

          也就是說(shuō)一對(duì)多和多對(duì)一的映射策略是一樣的,只是站的角度不同

          總的來(lái)說(shuō),在多的一方維護(hù)是比較好的.

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


          誰(shuí)要對(duì),那就在誰(shuí)類里拿到對(duì)方的引用,那就再誰(shuí)配置文件里配.


          1 單向
          還是兩個(gè)類,class和student.

          比起不用映射而言,student.hbm.xml不變,class.hbm.xml里多了的是:
          <set name="students">
              <key column="classesid"/>
              <one-to-many class="Student"/>
             </set>
          分析一下,用set標(biāo)簽的出發(fā)點(diǎn)是因?yàn)閏lass類里持有student的引用(一個(gè)set集合),至于為什么是集合而不

          是如以往的一個(gè)student直觀的引用,是因?yàn)橥怄I要設(shè)的不只是一個(gè).如果不能理解,就直接理解為必須用

          set標(biāo)簽就成了.
          那么name屬性是拿到引用,子標(biāo)簽key的column屬性是在student里加一個(gè)字段,名字叫classesid,
          而one-to-many標(biāo)簽是指向student類.
          如果<hibernate-mapping package="com.bjsxt.hibernate">這樣寫,
          那么在one-to-many標(biāo)簽直接跟類名.
          需要注意的是,此時(shí)的one-to-many標(biāo)簽里不再像以前的one-to-one標(biāo)簽里用的是name屬性而是class屬性.

          這兩個(gè)屬性的功能要分清楚.

          單向一對(duì)多有缺點(diǎn),因?yàn)橐谝坏囊欢司S護(hù),所以多的一段的表里的外鍵字段不可設(shè)為非空.
          而且要發(fā)出多余的update語(yǔ)句.一般都設(shè)為雙向的.下面來(lái)看雙向.


          2 雙向
          雙向配置的話class.hbm.xml不變,在student類里持有class類的引用,student.hbm.xml文件配置添加:

          <many-to-one name="classes" column="classesid(必須和class.hbm.xml里的<key

          column="classesid"/>一致)"/>

          這樣配置就可以存儲(chǔ).
          有三種存儲(chǔ)方式.這是第一種.因?yàn)槭且坏囊欢司S護(hù),所以多發(fā)兩條update.步驟是先挨個(gè)存student,再存

          class.
          第二種先存class,把classid字段存到student里,再挨個(gè)存student.也就是反轉(zhuǎn).class.hbm.xml里:
          <set name="students" inverse="true">
          第三種把classid字段存到student里,不存student.只存class. 也就是反轉(zhuǎn)并級(jí)聯(lián)操作.class.hbm.xml里

          :<set name="students" inverse="true" cascade="all">

          關(guān)于存儲(chǔ)上,基本上就這三種.無(wú)論是一對(duì)多還是多對(duì)一.個(gè)人認(rèn)為比較麻煩.具體應(yīng)用的時(shí)候可以考慮改進(jìn)

          .
          多對(duì)一的時(shí)候,因?yàn)檎驹诙嗟牧?chǎng),如果不級(jí)聯(lián),要先存一,把一的數(shù)據(jù)加到多里的引用,再存多.級(jí)聯(lián)了,因

          為不用考慮一的關(guān)系,所以只存多.
          而一對(duì)多的時(shí)候,反轉(zhuǎn)不級(jí)聯(lián),就站在多的立場(chǎng).也要先存一再存多.反轉(zhuǎn)只是立場(chǎng)轉(zhuǎn)為多對(duì)一,所以同上.
          反轉(zhuǎn)并級(jí)聯(lián),也同上.不考慮一.
          不反轉(zhuǎn)也不級(jí)聯(lián),因?yàn)檎驹谝坏牧?chǎng),就要先存多.把多加入到一的set集合,再存一.所以呢,立場(chǎng)和先存誰(shuí)

          是對(duì)立的.

          請(qǐng)消化一下以上的總結(jié).
          下面來(lái)看多對(duì)多.

          四 多對(duì)多關(guān)聯(lián)映射(單雙向)

          1 單向.

          多對(duì)多涉及到第三方表.hibernate會(huì)自動(dòng)生成.一般權(quán)限上會(huì)用到,比如RBAC模型.
          如以往一樣,兩個(gè)類,user和role.同樣,user持有role的引用,是一個(gè)set集合.(如前面的一對(duì)多)
          Role.hbm.xml沒(méi)有變化, User.hbm.xml里多的是:
          <set name="roles" table="t_user_role">
              <key column="userid"/>
              <many-to-many class="com.bjsxt.hibernate.Role" column="roleid"/>
             </set>
          分析一下,set標(biāo)簽不用多說(shuō),table屬性是指讓hibernate自動(dòng)建立第三方表名字叫"t_user_role",key標(biāo)簽

          是指在此表中生成一個(gè)關(guān)聯(lián)到本類(user的)叫userid的字段,
          <many-to-many>標(biāo)簽里class屬性引入類Role,并在t_user_role里生成一個(gè)關(guān)聯(lián)到role的roleid字段.

          在t_user_role表里,userid和roleid一并叫做復(fù)合主鍵.因?yàn)閮烧叩穆?lián)合有不可重復(fù)性.

          其存儲(chǔ)流程:1,存入role,2,用一個(gè)set集合接住role放到user的set里,(這里交叉存入比較容易看暈)3,挨

          個(gè)存user.與上面的第二種存儲(chǔ)方案差不多.
          Load時(shí)候就簡(jiǎn)單,加載進(jìn)來(lái),在user里用一個(gè)遍歷挨個(gè)從set里拿出來(lái).就得到role表里的值.
          執(zhí)行存入的時(shí)候,hibernate就把表t_user_role各個(gè)值賦予了.


          2 雙向


          基本上與單向一致.
          Role里要持有user的引用,也是set集合,
          Role.hbm.xml和user.hbm.xml配置差不多.
          <set name="users" table="t_user_role" order-by="userid">
              <key column="roleid"/>
              <many-to-many class="com.bjsxt.hibernate.User" column="userid"/>
             </set>
          注意兩類對(duì)比,保持column屬性值一致.

          table屬性值必須和單向關(guān)聯(lián)中的table屬性值一致
          <key>中column屬性值要與單向關(guān)聯(lián)中的<many-to-many>標(biāo)簽中的column屬性值一致
          在<many-to-many>中的column屬性值要與單向關(guān)聯(lián)中<key>標(biāo)簽的column屬性值一致

          order-by="userid"屬性是用來(lái)排序,按照t_user_role表的字段來(lái)排.

          基本上,hibernate映射關(guān)系就是這些了

          posted on 2011-03-26 23:35 甜咖啡 閱讀(290) 評(píng)論(0)  編輯  收藏


          只有注冊(cè)用戶登錄后才能發(fā)表評(píng)論。


          網(wǎng)站導(dǎo)航:
           

          導(dǎo)航

          <2011年3月>
          272812345
          6789101112
          13141516171819
          20212223242526
          272829303112
          3456789

          統(tǒng)計(jì)

          常用鏈接

          留言簿(1)

          我參與的團(tuán)隊(duì)

          隨筆檔案

          搜索

          最新評(píng)論

          閱讀排行榜

          評(píng)論排行榜

          主站蜘蛛池模板: 无棣县| 阿勒泰市| 龙江县| 云安县| 营口市| 毕节市| 德兴市| 仁怀市| 邯郸市| 沂源县| 谢通门县| 聂拉木县| 新闻| 楚雄市| 大荔县| 石棉县| 镇原县| 蒙阴县| 武隆县| 庆云县| 泽州县| 新竹市| 贵港市| 东安县| 长海县| 博白县| 呼玛县| 富平县| 昌图县| 平昌县| 温泉县| 井冈山市| 东乡族自治县| 元氏县| 黄山市| 潼南县| 晴隆县| 子长县| 麟游县| 达日县| 溧水县|