隨筆 - 3, 文章 - 152, 評論 - 17, 引用 - 0
          數據加載中……

          [轉]hibernate:one-to-one的學習小經驗

           one-to-one在hibernate中可以用來作為兩張表之間的主鍵關聯,這也是hibernate中主鍵關聯的一種用法,這樣在一張表中的ID,在生成另外一張表的同時回自動插入到相應的ID字段中去,相應的XML文件設置比較簡單,舉例如下:

              <!-- 建立一對一的到Address的映射,這個是寫在User的XML配置文件中的 -->
              <!-- 相應的User bean(PO)中也要添加屬性 com.xx.Address  address-->
              <one-to-one name="address" cascade="all" class="com.xx.Address"/>
             
             <!-- cascade的屬性設置不再重復了,可以查看hibernate文檔 -->

              <!-- 建立一對一的到User的映射,這個是寫在Address的XML配置文件中的 -->
              <!-- 相應的Address bean(PO)中也要添加屬性 com.xx.User user--> -->
              <one-to-one name="user" class="com.xx.User" constrained="true"/>

                為了在Address中使用User中的主鍵ID值,我們需要設置Address中的主鍵生成規則,如下所示,采用foreign關鍵字

             <id column="ID" name="id" type="long" unsaved-value="0">
                <generator class="foreign">
                  <param name="property">user</param> 
                </generator>
             </id>


                這里需要注意的是property的屬性值必須與上面到User的映射所填寫的name屬性值一致,這樣就完成了one-to-one的映射關系。

          上面的過程都很簡單,下面我來說說這里需要注意的地方:

            1.   在設置屬性ID的時候必須注意字段的長度,如筆者這樣使用oracle的sequence來生成ID,其長度有14位之長,則應選擇hibernate類型long,對應的實體中應選擇Long,這樣不會出現溢出的情況。


            2.   在測試的時候必須要注意這兩張表之間因為已經存在了一對一的關系,所以我們不能只寫
                   user.setAddress(address);
                   而忽略了
                   address.setUser(user);
                   這樣在做插入的時候會報出attempted to assign id from null one-to-one property: address的錯誤,這一點初學者會經常犯,筆者也是其中之一。


           3.   如果不寫cascade="all"或者寫成cascade="none"的話,即使你寫了
                   user.setAddress(address);
                   address.setUser(user);
                 也不會發生任何事情,只有user會被存儲。

          以上是一些筆者經歷的小經驗,如果有不對的地方歡迎指正。

          posted on 2005-08-19 13:45 閱讀(829) 評論(0)  編輯  收藏 所屬分類: Hibernate

          主站蜘蛛池模板: 保靖县| 富顺县| 含山县| 康马县| 陇西县| 盐城市| 布拖县| 封丘县| 清河县| 库尔勒市| 宣恩县| 鹿泉市| 宝鸡市| 三门县| 涡阳县| 诸城市| 鄢陵县| 桓仁| 金昌市| 策勒县| 东乌珠穆沁旗| 大连市| 勐海县| 平陆县| 介休市| 剑河县| 安阳市| 阿拉善盟| 林甸县| 蒙山县| 卢氏县| 隆尧县| 英山县| 万源市| 松江区| 潮安县| 元朗区| 鄄城县| 清水县| 河北区| 霍林郭勒市|