<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    甜咖啡

    我的IT空間

    hibernate關聯映射之逐步分析

    一對一關聯映射(單雙向)


    1 單向

    主要是配置文件上的標簽配置
    比如對于person和idcard兩個pojo類。
    Person持有idcard的引用。在person.hbm.xml里,person的主鍵要來源于idcard類,也就是共享idcard的

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

    載.
    標簽name屬性是通過person類的idcard,關聯到idcard類.
    Constrained屬性主要聲明是外鍵約束.
    <one-to-one name="idcard" constrained ="true">


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

    二 多對一關聯映射(單雙向)


    1 單向

    多對一及其簡單.
    比如兩個類,user和group.user為多的一方,group為一的一方,只要多的一方在類中持有一的一方的引用,

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

    2 雙向

    看下面的一對多就知道,多對一和一對多是相對立的.
    一對多關聯映射利用了多對一關聯映射原理

    多對一關聯映射:在多的一端加入一個外鍵指向一的一端,它維護的關系是多指向一
    一對多關聯映射:在多的一端加入一個外鍵指向一的一端,它維護的關系是一指向多

    也就是說一對多和多對一的映射策略是一樣的,只是站的角度不同

    總的來說,在多的一方維護是比較好的.

    三 一對多關聯映射(單雙向)


    誰要對,那就在誰類里拿到對方的引用,那就再誰配置文件里配.


    1 單向
    還是兩個類,class和student.

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

    是如以往的一個student直觀的引用,是因為外鍵要設的不只是一個.如果不能理解,就直接理解為必須用

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

    這兩個屬性的功能要分清楚.

    單向一對多有缺點,因為要在一的一端維護,所以多的一段的表里的外鍵字段不可設為非空.
    而且要發出多余的update語句.一般都設為雙向的.下面來看雙向.


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

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

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

    這樣配置就可以存儲.
    有三種存儲方式.這是第一種.因為是一的一端維護,所以多發兩條update.步驟是先挨個存student,再存

    class.
    第二種先存class,把classid字段存到student里,再挨個存student.也就是反轉.class.hbm.xml里:
    <set name="students" inverse="true">
    第三種把classid字段存到student里,不存student.只存class. 也就是反轉并級聯操作.class.hbm.xml里

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

    關于存儲上,基本上就這三種.無論是一對多還是多對一.個人認為比較麻煩.具體應用的時候可以考慮改進

    .
    多對一的時候,因為站在多的立場,如果不級聯,要先存一,把一的數據加到多里的引用,再存多.級聯了,因

    為不用考慮一的關系,所以只存多.
    而一對多的時候,反轉不級聯,就站在多的立場.也要先存一再存多.反轉只是立場轉為多對一,所以同上.
    反轉并級聯,也同上.不考慮一.
    不反轉也不級聯,因為站在一的立場,就要先存多.把多加入到一的set集合,再存一.所以呢,立場和先存誰

    是對立的.

    請消化一下以上的總結.
    下面來看多對多.

    四 多對多關聯映射(單雙向)

    1 單向.

    多對多涉及到第三方表.hibernate會自動生成.一般權限上會用到,比如RBAC模型.
    如以往一樣,兩個類,user和role.同樣,user持有role的引用,是一個set集合.(如前面的一對多)
    Role.hbm.xml沒有變化, 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標簽不用多說,table屬性是指讓hibernate自動建立第三方表名字叫"t_user_role",key標簽

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

    在t_user_role表里,userid和roleid一并叫做復合主鍵.因為兩者的聯合有不可重復性.

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

    個存user.與上面的第二種存儲方案差不多.
    Load時候就簡單,加載進來,在user里用一個遍歷挨個從set里拿出來.就得到role表里的值.
    執行存入的時候,hibernate就把表t_user_role各個值賦予了.


    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>
    注意兩類對比,保持column屬性值一致.

    table屬性值必須和單向關聯中的table屬性值一致
    <key>中column屬性值要與單向關聯中的<many-to-many>標簽中的column屬性值一致
    在<many-to-many>中的column屬性值要與單向關聯中<key>標簽的column屬性值一致

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

    基本上,hibernate映射關系就是這些了

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


    只有注冊用戶登錄后才能發表評論。


    網站導航:
     

    導航

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

    統計

    常用鏈接

    留言簿(1)

    我參與的團隊

    隨筆檔案

    搜索

    最新評論

    閱讀排行榜

    評論排行榜

    主站蜘蛛池模板: 一级毛片免费播放| 老司机69精品成免费视频| 美女内射毛片在线看免费人动物| jizz中国免费| 久久久久久A亚洲欧洲AV冫| 91亚洲一区二区在线观看不卡| 国产亚洲精品成人AA片| 国产精品小视频免费无限app| 日本在线高清免费爱做网站| 亚洲国产成人超福利久久精品| 一区二区三区视频免费观看| ZZIJZZIJ亚洲日本少妇JIZJIZ| 亚洲av无码专区在线| 毛片免费vip会员在线看| 亚洲av永久无码精品秋霞电影秋 | 亚洲乱码中文字幕久久孕妇黑人 | 精品无码一区二区三区亚洲桃色 | 中文日本免费高清| 日韩午夜免费视频| 日亚毛片免费乱码不卡一区| 亚洲综合图色40p| 91人人区免费区人人| 久久精品国产亚洲Aⅴ蜜臀色欲| 亚洲国产成+人+综合| 日本特黄特黄刺激大片免费| 亚洲精品在线网站| 伊人久久免费视频| 亚洲毛片αv无线播放一区| 久久香蕉国产线看免费| 亚洲国产91在线| 亚洲伊人久久成综合人影院| 日本卡1卡2卡三卡免费| 亚洲精品无码日韩国产不卡av| 国产精品久久永久免费| 麻豆va在线精品免费播放| 久久久久亚洲AV成人无码网站| 免费大片av手机看片高清| 亚洲日本va午夜中文字幕一区| a级毛片免费全部播放| 亚洲av无码一区二区三区天堂古代| 久久久久免费精品国产|