【SSH】——Hibernate(4)關聯映射之單向映射

      在上一篇SSH】——Hibernate3)實體映射中,已經提到了,ORM功能的實現,主要文件有映射類(*.java,映射文件(*.hbm.xml)和配置文件(*.property/.cfg.xml)。接下來通過三個文件,對映射類的實現進行分析。

 

      關聯映射主要分爲兩大類:單向關聯和雙向關聯。今天主要說一下單向關聯

 

      一)一對一關聯映射

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

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

 

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

                   

                           

                              


      Hbm.xml配置文件:

 <hibernate-mapping>  
        <class name="com.example.hibernate.IdCard" table="t_idCard">  
            <id name="id">  
                <generator class="native"/>  
            </id>  
            <property name="cardNo"/>  
        </class>  
    </hibernate-mapping>  

 <hibernate-mapping>  
        <class name="com.example.hibernate.User" table="t_person">  
            <id name="id">  
                <!-- 採用foreign生成策略,它會取得關聯對象的標識 -->  
                <generator class="foreign">  
                    <!-- property 指的是關聯的對象 -->  
                    <param name="property">idCard</param>  
                </generator>  
            </id>  
            <property name="name"/>  
            <one-to-one name="idCard" constrained="true" />  
        </class>  
    </hibernate-mapping>  


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


                              


      Hbm.xml文件配置:

<hibernate-mapping>  
        <class name="com.example.hibernate.Person" table="t_person">  
            <id name="id">  
                <generator class="native"/>  
            </id>  
            <!-- property指關聯對象 --> 
            <property name="name"/>  
            <!-- 默認參考idCard的主鍵-->  
            <many-to-one name="idCard" unique="true"/>  
        </class>  
    </hibernate-mapping>  

<hibernate-mapping>  
    <class name="com.example.hibernate.IdCard" table="t_idCard">  
        <id name="id">  
            <generator class="native"/>  
        </id>  
        <property name="cardNo"/>  
    </class>  

</hibernate-mapping>


      二)多對一關聯映射

      用戶和組是多對一的關係。一個組有多個用戶,一個用戶只屬於一個組。 
      有了ER圖知識的積累,我們知道多對一的關聯映射策略一定是在多的一端加入一個外鍵,指向一的一端。


                              

      Hbm.xml文件配置:

<hibernate-mapping>

    <classname="com.bjpowernode.hibernate.User"table="t_user">
        <idname="id">
            <generatorclass="native"/>
        </id>

        <propertyname="name"/>
        <many-to-one name="group"column="groupid"cascade="save-update"/>
    </class>

</hibernate-mapping>

      三)一對多關聯映射(***)

      班級和學生是一對多的關係。一個班級有多個學生,一個學生只能屬於一個班。 
      在多的一端加入一一端的主鍵當做外鍵。這樣的冗餘是最少的。


                           



      hbm.xml文件配置:
      在一的一端加入標籤映射

<hibernate-mapping>

    <classname="com.bjpowernode.hibernate.Group"table="t_group">

        <idname="id">

            <generatorclass="native"/>

        </id>

        <propertyname="name"/>

        <set name=”users”>

            <key column=”groupId”/>

            <one-to-many class="com.bjpowernode.hibernate.User">

        </set>

    </class>

</hibernate-mapping>

      我們採用的是在一的一端維護關係。這樣的話,多的一端並不知道一的一端的存在。也就是說學生並不知道班級的存在。


      四)多對多關聯映射

      用戶和角色的關係。一個用戶可以有多個角色,一個角色可以有多個用戶。 

      n:n的關係,一定會有一張第三張表來維護他們的關係。


                                   

      

      如果是user單向對role 那麼則在user的一端加入標籤映射。

      hbm.xml文件配置:

<set name="roles" table="t_user_role">  
     <key column="user_id"/>  
     <many-to-many class="com.hibernate.Role" column="role_id"/>  

</set>  




  

發佈了120 篇原創文章 · 獲贊 10 · 訪問量 17萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章