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

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

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

    yxhxj2006

    常用鏈接

    統計

    最新評論

    Hibernate映射解析——七種映射關系

    首先我們了解一個名詞ORM,全稱是(Object Relational Mapping),即對象關系映射。ORM的實現思想就是將關系數據庫中表的數據映射成對象,以對象的形式展現,這樣開發人員就可以把對數據庫的操作轉化為對這些對象的操作。Hibernate正是實現了這種思想,達到了方便開發人員以面向對象的思想來實現對數據庫的操作。

    Hibernate在實現ORM功能的時候主要用到的文件有:映射類(*.java)、映射文件(*.hbm.xml)和數據庫配置文件(*.properties/*.cfg.xml),它們各自的作用如下。

    映射類*.java:它是描述數據庫表的結構,表中的字段在類中被描述成屬性,將來就可以實現把表中的記錄映射成為該類的對象了。

    映射文件(*.hbm.xml:它是指定數據庫表和映射類之間的關系,包括映射類和數據庫表的對應關系、表字段和類屬性類型的對應關系以及表字段和類屬性名稱的對應關系等。

    數據庫配置文件(*.properties/*.cfg.xml:它是指定與數據庫連接時需要的連接信息,比如連接哪種數據庫、登錄數據庫的用戶名、登錄密碼以及連接字符串等。當然還可以把映射類的地址映射信息放在這里。

    接下來讓我們就一起走進Hibernate的七種映射關系:

    1、單向一對一關聯映射(one-to-one):

    兩個對象之間一對的關系,例如:Person(人)-IdCard(身份證)

    有兩種策略可以實現一對一的關聯映射:

    *主鍵關聯:即讓兩個對象具有相同的主鍵值,以表明它們之間的一一對應的關系;數據庫表不會有額外的字段來維護它們之間的關系,僅通過表的主鍵來關聯。如下圖:

     

    例子:單向一對一主鍵關聯例子連接

    *唯一外鍵關聯:外鍵關聯,本來是用于多對一的配置,但是加上唯一的限制之后(采用<many-to-one>標簽來映射,指定多的一端uniquetrue,這樣就限制了多的一端的多重性為一),也可以用來表示一對一關聯關系,其實它就是多對一的特殊情況。如下圖:

     

    例子:單向一對一唯一外鍵關聯例子連接

    注意:因為一對一的主鍵關聯映射擴展性不好,當我們的需要發生改變想要將其變為一對多的時候變無法操作了,所以我們遇到一對一關聯的時候經常會采用唯一外鍵關聯來解決問題,而很少使用一對一主鍵關聯。

    2、單向多對一關聯映射(many-to-one):

    多對一關聯映射原理:在多的一端加入一個外鍵,指向一的一端,如下圖:

     

    關鍵映射代碼——在多的一端加入如下標簽映射:

     

    Java代碼 
    1. <many-to-one name="group" column="groupid"/>  

     

    3、單向一對多關聯映射(one-to-many)

    一對多關聯映射和多對一關聯映射原理是一致的,都是在多的一端加入一個外鍵,指向一的一端。如下圖(學生和班級):

     

    注意:它與多對一的區別是維護的關系不同

    *多對一維護的關系是:多指向一的關系,有了此關系,加載多的時候可以將一加載上來

    *一對多維護的關系是:一指向多的關系,有了此關系,在加載一的時候可以將多加載上來

    關鍵映射代碼——在一的一端加入如下標簽映射:

     

    Java代碼 
    1. <set name="students">  
    2.       <key column="classesid"/>  
    3.       <one-to-many class="com.hibernate.Student"/>  
    4. </set>  

     

    缺陷:因為多的一端Student不知道Classes的存在(也就是Student沒有維護與Classes的關系)所以在保存Student的時候關系字段classesid是為null的,如果將該關系字段設置為非空,則將無法保存數據,常用解決辦法是改用雙向關聯映射,參見6

    4、單向多對多映射(many-to-many)

    多對多關聯映射新增加一張表才完成基本映射,如下圖:

     

    關鍵映射代碼——可以在User的一端加入如下標簽映射:

     

    Java代碼 
    1. <set name="roles" table="t_user_role">  
    2.      <key column="user_id"/>  
    3.      <many-to-many class="com.hibernate.Role" column="role_id"/>  
    4. </set>  

     

    5、雙向一對一關聯映射

    對比單向一對一映射,需要在IdCard加入<one-to-one>標簽,它不影響,只影響加載。如下圖:

    雙向一對一主鍵映射關鍵映射代碼——在IdCard端新加入如下標簽映射

     

    Java代碼 
    1. <one-to-one name="person"/>  

     

    雙向一對一唯一外鍵映射關鍵映射代碼——在IdCard端新加入如下標簽映射

     

    Java代碼 
    1. <one-to-one name="person"property-ref="idCard"/>  

     

    注意:一對一唯一外鍵關聯雙向采用<one-to-one>標簽映射,必須指定<one-to-one>標簽中的property-ref屬性為關系字段的名稱

    6、雙向一對多關聯映射(非常重要

    采用一對多雙向關聯映射的目的主要是為了主要是為了解決一對多單向關聯的缺陷而不是需求驅動的。

    一對多雙向關聯的映射方式:

    * 在一的一端的集合上采用<key>標簽,在多的一端加入一個外鍵

    * 在多的一端采用<many-to-one>標簽

    注意:<key>標簽和<many-to-one>標簽加入的字段保持一直,否則會產生數據混亂

    關鍵映射代碼:

    在Classes的一端加入如下標簽映射:

     

    Java代碼 
    1. <set name="students"inverse="true">  
    2.        <key column="classesid"/>  
    3.       <one-to-many class="com.hibernate.Student"/>  
    4. </set>  

     

    在Student的一端加入如下標簽映射:

     

    Java代碼 
    1. <many-to-one name="classes" column="classesid"/>  

     

    注釋:inverse屬性

    * inverse屬性可以用在一對多和多對多雙向關聯上,inverse屬性默認為false,為false表示本端可以維護關系,如果inverse為true,則本端不能維護關系,會交給另一端維護關系,本端失效。所以一對多關聯映射我們通常在多的一端維護關系,讓一的一端失效。

    * inverse是控制方向上的反轉,只影響存儲

    7、雙向多對多關聯映射

    雙向的目的就是為了兩端都能將對方加載上來,和單向多對多的區別就是雙向需要在兩端都加入標簽映射,需要注意的是:

    * 生成的中間表名稱必須一樣

    * 生成的中間表中的字段必須一樣

    Role(角色)端關鍵映射代碼:

     

    Java代碼 
    1. <set name="users" table="t_user_role">  
    2.        <key column="role_id"/>  
    3.        <many-to-many class="com.hibernate.User" column="user_id"/>  
    4. lt;/set>  

     

    User(用戶)端關鍵映射代碼:

     

    Java代碼 
    1. <set name="roles" table="t_user_role">  
    2.       <key column="user_id"/>  
    3.       <many-to-many class="com. hibernate.Role" column="role_id"/>  
    4. lt;/set>  

     

    總結:對于上面這七種關聯映射中,最重要的就是一對多的映射,因為它更貼近我們的現實生活,比如:教室和學生就可以是典型的一對多的關系,而我們開發軟件的目的之一就是為了解決一些生活中重復性問題,把那些重復的問題交給計算機幫助我們完成,從而來提高我們的工作效率。一句話:生活離開不開編程,編程更離不開生活

    posted on 2012-08-15 12:31 奮斗成就男人 閱讀(327) 評論(0)  編輯  收藏 所屬分類: J2EE

    主站蜘蛛池模板: a级毛片在线免费观看| 国产福利电影一区二区三区,免费久久久久久久精 | 亚洲国产综合人成综合网站| 亚洲av永久无码天堂网| 最近免费中文字幕4| 久久久久亚洲国产| 成人男女网18免费视频| 亚洲av无码无线在线观看| 日韩精品视频免费网址| 国产午夜亚洲精品不卡| 亚洲国产精品尤物yw在线| 一区二区三区免费在线观看| 亚洲乱码中文字幕综合| 久久狠狠躁免费观看2020| 亚洲最大免费视频网| 在线免费视频一区| 一级视频免费观看| 亚洲第一福利视频| 国产卡一卡二卡三免费入口| 亚洲欧美国产日韩av野草社区| 国产zzjjzzjj视频全免费| 精品国产免费一区二区三区| 香蕉视频在线观看亚洲| 无码免费午夜福利片在线| 美女黄色毛片免费看| 亚洲AV午夜成人片| 成人A级毛片免费观看AV网站| 韩国亚洲伊人久久综合影院| 亚洲熟妇av一区二区三区| 亚洲免费在线视频播放| 亚洲中文字幕久久久一区| 久久久青草青青国产亚洲免观| 久久免费视频99| 亚洲av无码一区二区三区四区 | 国产自产拍精品视频免费看| 岛国精品一区免费视频在线观看 | 国产精品免费观看| 另类专区另类专区亚洲| 亚洲国产精品婷婷久久| 在线观看免费亚洲| 特级无码毛片免费视频尤物|