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

          [轉(zhuǎn)]hibernate:one-to-one的學習小經(jīng)驗

           one-to-one在hibernate中可以用來作為兩張表之間的主鍵關聯(lián),這也是hibernate中主鍵關聯(lián)的一種用法,這樣在一張表中的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中的主鍵生成規(guī)則,如下所示,采用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,這樣不會出現(xiàn)溢出的情況。


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


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

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

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

          主站蜘蛛池模板: 襄樊市| 靖安县| 隆尧县| 连州市| 玉树县| 信丰县| 双江| 诏安县| 巴楚县| 乌兰浩特市| 满洲里市| 绥德县| 桓仁| 克山县| 汶上县| 忻城县| 苍山县| 盐亭县| 临桂县| 自治县| 昌宁县| 和平县| 通榆县| 大同县| 安顺市| 郓城县| 巴林右旗| 右玉县| 古蔺县| 丰镇市| 天全县| 泰安市| 铜川市| 敦化市| 仙桃市| 会宁县| 嫩江县| 明溪县| 东方市| 浦北县| 咸阳市|