hibernate一對一完美版

          Posted on 2008-08-26 04:10 H2O 閱讀(645) 評論(0)  編輯  收藏 所屬分類: hibernate

          Hibernate一對一關系操作對象


          總的來說有四種方式,我將意義的在本片文章中介紹
          一:以主鍵關聯

           概念:關聯的兩個實體共享一個主鍵
          例如我們建立兩個表,分別為user id pk,name,password
                                                      userinfor id pk,email,age,address
          user和userinfor共享一個主鍵id,并且兩個表是一對一關系,那么如何讓一個表引用另一個表生成的主鍵那?我們可以用hibernate的主鍵foreign機制生成。
          我們先看看user.hbm.xml文件
          .......
          <hibernate-mapping>
           <class name="model.User" lazy="true">
            <id name="id" unsaved-value="null">
             <generator class="uuid.hex"/>
            </id>
            <property name="name" type="string"/>
            <property name="password" type="string"/>
            <one-to-one name="userinfor"
                 class="model.Userinfor"
                 fetch="join"
                 cascade="all"
                 />
           </class>
          <hibernate-mapping>
          .......
              one-to-one的屬性cascade=all表示user的增刪改操作也會反映在userinfor對象當中。我們再看看userinfor.hbm.xml文件.
          <hibernate-mapping>
           <id name="id">
            <generator name="foreign">
             <param name="property">user</param>
            </generator>
           </id>
           <property name="email" column="email" type="string"/>
           <property name="age" column="age" type="int"/>
           <property name="address" column="address" type="string"/>
           <one-to-one name="user"
                class="model.User"
                constrained="true"<!-引用user的主鍵id為外鍵-->
                />
          </hibernate-mapping>
          讓我們看看java的代碼片段
          .....
          User user=new User();
          user.setName("name");
          user.setPassword("pass");
          Userinfor u=new Userinfor();
          u.setEmail("email");
          u.setAge(11);
          u.setAddress("address");
          user.setUserinfor(u);
          u.setUser(user);
          DAO.saveObj(user);
          最后打開你的數據庫舊可以看到結果了。

          二,一對一以外鍵關聯

           以外鍵關聯的概念:兩個實體各自有不同的主鍵,但是一個實體有一個外鍵引用另一個實體的主鍵。例如:
           表 user id pk,name,passeword
              userinfor id pk,uid fk,infor
           先看user.hbm.xml
           ......
           <hibernate-mapping>
           <class name="user" table="user" lazy="true">
            <id name="id" unsaved-value="null">
             <generator class="uuid.hex"/>
            </id>
            <property name="name" type="string"/>
            <property name="password" type="string"/>
            <one-to-one name="userinfor"
             class="model.Userinfor"
             fetch="join"
             cascade="all"
             />
           </class>
           </hibernate-mapping>
           可以看到這個同我們第一次用到的一樣啊
           然后我們看看userinfor.hbm.xml的結構
           .....
           <hibernate-mapping>
           <class name="userinfor" table="userinfor" lazy="true">
            <id name="id">
             <generator class="uuid.hex"/>
            </id>
            <property name="infor" column="infor" type="string"/>
            <many-to-one name="user"
              class="model.User"
              unique="true"
              <!-唯一的多對一,其實就便成了一對一了-->
              columnn="uid"
              />
           </class>
           </hibernate-mapping>
           以外鍵關聯的一對一,其實就變成了一對多的雙向關聯,編寫時直接按照一對多和多對一的要求編寫,最后在many-to-one加上unique='true'即可說明他只不過是一對多關系的一個特例。編寫java代碼:
          .......
          User u=new User();
          u.setName("name");
          u.setPassword("password");
          Userinfor ui=new Userinfor();
          ui.setInfor("infor");
          u.setUserinfor(ui);
          ui.setUser(u);
          DAO.saveObj(u);
          ......
          三:默認的級連關系

           一對多默認級連關系為預先抓取,而一對多,多對多都是立即加載
          看看user.hbm.xml
          <one-to-one name="userinfor"
            class="model.Userinfor"
            cascade="all"/>
          以上我們并沒有顯示的設置級連關系。這樣在取的userinfor時將用默認的級連關系。
          .....
          User u=(User)DAO.getByid(User.class,"字符穿,相當于where id='此值'");

          四:延遲加載

           一對一關系進行延遲加載時與其他關系不同,多對一是在class標簽中設置lazy='true',一對多和多對多是在set標簽中設置lazy=”true“,而一對一則在class標簽當中設置lazy='true'并且在one-to-one標簽當中設置constrained='true'。
           .....
           <hibernate-mapping>
           <class name="model.User" table="user">
            <one-to-one name="userinfor"
              class="model.Userinfor"
              contrained="true"
              cascade="all"
              />
           </class>
           </hibernate-mapping>
          java代碼
          ...
          User u=(User)DAO.getByid(User.class,"id");
          .....
          次代碼只是加載了user對象,而沒有加載userinfor對象,而且忽略了默認的預先抓取,(這是默認的,只有顯示的指定fatch='true'時才采用預先抓取的)

          posts - 0, comments - 21, trackbacks - 0, articles - 101

          Copyright © H2O

          主站蜘蛛池模板: 织金县| 诸暨市| 伊吾县| 色达县| 天峻县| 保康县| 兰州市| 衡阳县| 德江县| 张掖市| 舒兰市| 汤原县| 都昌县| 黑龙江省| 永泰县| 青田县| 霍州市| 外汇| 伊春市| 泾源县| 陆丰市| 汪清县| 若羌县| 海原县| 神农架林区| 中方县| 芮城县| 天全县| 三门峡市| 广平县| 松溪县| 南川市| 新河县| 卫辉市| 定安县| 布拖县| 昂仁县| 五峰| 杂多县| 和政县| 长治县|