<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    hibernate一對(duì)一完美版

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

    Hibernate一對(duì)一關(guān)系操作對(duì)象


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

     概念:關(guān)聯(lián)的兩個(gè)實(shí)體共享一個(gè)主鍵
    例如我們建立兩個(gè)表,分別為user id pk,name,password
                                                userinfor id pk,email,age,address
    user和userinfor共享一個(gè)主鍵id,并且兩個(gè)表是一對(duì)一關(guān)系,那么如何讓一個(gè)表引用另一個(gè)表生成的主鍵那?我們可以用hibernate的主鍵foreign機(jī)制生成。
    我們先看看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的增刪改操作也會(huì)反映在userinfor對(duì)象當(dāng)中。我們?cè)倏纯磚serinfor.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);
    最后打開你的數(shù)據(jù)庫舊可以看到結(jié)果了。

    二,一對(duì)一以外鍵關(guān)聯(lián)

     以外鍵關(guān)聯(lián)的概念:兩個(gè)實(shí)體各自有不同的主鍵,但是一個(gè)實(shí)體有一個(gè)外鍵引用另一個(gè)實(shí)體的主鍵。例如:
     表 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>
     可以看到這個(gè)同我們第一次用到的一樣啊
     然后我們看看userinfor.hbm.xml的結(jié)構(gòu)
     .....
     <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"
        <!-唯一的多對(duì)一,其實(shí)就便成了一對(duì)一了-->
        columnn="uid"
        />
     </class>
     </hibernate-mapping>
     以外鍵關(guān)聯(lián)的一對(duì)一,其實(shí)就變成了一對(duì)多的雙向關(guān)聯(lián),編寫時(shí)直接按照一對(duì)多和多對(duì)一的要求編寫,最后在many-to-one加上unique='true'即可說明他只不過是一對(duì)多關(guān)系的一個(gè)特例。編寫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);
    ......
    三:默認(rèn)的級(jí)連關(guān)系

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

    四:延遲加載

     一對(duì)一關(guān)系進(jìn)行延遲加載時(shí)與其他關(guān)系不同,多對(duì)一是在class標(biāo)簽中設(shè)置lazy='true',一對(duì)多和多對(duì)多是在set標(biāo)簽中設(shè)置lazy=”true“,而一對(duì)一則在class標(biāo)簽當(dāng)中設(shè)置lazy='true'并且在one-to-one標(biāo)簽當(dāng)中設(shè)置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對(duì)象,而沒有加載userinfor對(duì)象,而且忽略了默認(rèn)的預(yù)先抓取,(這是默認(rèn)的,只有顯示的指定fatch='true'時(shí)才采用預(yù)先抓取的)

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

    Copyright © H2O

    主站蜘蛛池模板: 中中文字幕亚洲无线码| 日本亚洲视频在线 | 国产精品免费观看| 久久久久亚洲av毛片大| 亚洲av无码一区二区三区人妖| 24小时日本韩国高清免费| 亚洲人精品午夜射精日韩 | 亚洲小说区图片区另类春色| 国产精品亚洲一区二区三区| 一二三四免费观看在线视频中文版 | 美女被免费视频网站a国产| 亚洲一级视频在线观看| 无码国产精品一区二区免费模式| 相泽亚洲一区中文字幕| 国产成人亚洲精品无码AV大片 | 免费国产一级特黄久久| 黑人粗长大战亚洲女2021国产精品成人免费视频| 在线成人爽a毛片免费软件| 亚洲综合激情六月婷婷在线观看| 嫩草成人永久免费观看| 国产亚洲精品xxx| 久草免费手机视频| 91亚洲国产成人久久精品网站| 91麻豆国产免费观看| 亚洲国产精品日韩在线| 在线观看免费人成视频色9| 亚洲综合中文字幕无线码| 最近中文字幕无吗免费高清| 国产精品高清视亚洲一区二区| 好男人www免费高清视频在线| 亚洲av无码成人精品国产| yy6080亚洲一级理论| 精品乱子伦一区二区三区高清免费播放| 免费看片免费播放| 日韩免费在线中文字幕| 三上悠亚亚洲一区高清| 91在线手机精品免费观看| 亚洲日本一线产区和二线 | 亚洲AⅤ永久无码精品AA| 在线视频网址免费播放| 亚洲最大成人网色|