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會被存儲。

          posts - 41, comments - 7, trackbacks - 0, articles - 0

          Copyright © weibogao

          主站蜘蛛池模板: 成安县| 甘孜县| 九龙城区| 广东省| 仙居县| 会理县| 井冈山市| 哈密市| 准格尔旗| 内黄县| 兴宁市| 老河口市| 府谷县| 阆中市| 新泰市| 罗江县| 昌邑市| 阜宁县| 星座| 兴义市| 赣州市| 界首市| 汉阴县| 山东省| 类乌齐县| 汶川县| 平陆县| 丹巴县| 昌黎县| 长垣县| 普安县| 彩票| 凌源市| 宜阳县| 仁寿县| 松潘县| 吉隆县| 通海县| 噶尔县| 定安县| 阳朔县|