Kira-2006
          -僅僅是一陣風(fēng)也罷了,偏偏是這樣永恒, 僅僅是一場夢也罷了,偏偏是如此的真實(shí),
          posts - 4,comments - 7,trackbacks - 0

          一對一關(guān)聯(lián)
              主鍵關(guān)聯(lián):
          即兩張表通過主鍵形成一對一映射關(guān)系。

              用戶TUser與護(hù)照TPassport關(guān)聯(lián)
              TUer.hbm.xml
              
          <hibernate-mapping>
          <class
              
          name="TUser"
              table
          ="T_User">
              
              
          <one-to-one 
                  
          name="passport"
                  class
          ="TPassport"
                  cascade
          ="all"
                  outer-join
          ="true"/>
              
          </class>
          </hibernate-mapping>
          cascade="all"表示級聯(lián)關(guān)系設(shè)置為“all”,即無論主空房執(zhí)行任何操作,都會關(guān)聯(lián)類執(zhí)行相同的操作。

              TPassport.hbm.xml
          <hibernate-mapping>
          <class
              
          name="TPassport"
              table
          ="T_Passport">
              
          <one-to-one
                  
          name="user"
                  class
          ="TUser"
                  constrain
          ="true">
              .
          </class>
          </hibernate-mapping>

              
          constrain必須設(shè)定為“true”,以告知Hibernate當(dāng)前主鍵上存在一個約束。
             
              測試代碼:
          TUser user = new TUser();
          user.setAge(
          new Integer(20));
          user.setName(
          "Carin");

          TPassport passport 
          = new TPassport();
          passport.setSerial(
          "PCN759386");
          passport.setExpiry(
          new Integer(20080101));

          //相互設(shè)置關(guān)聯(lián)
          passport.setUser(user);
          user.setPassport(passport);

          Transaction tx 
          = sessioin.beginTransaction();
          //由于TUser類的one-to-one節(jié)點(diǎn)被設(shè)置成
          //cascade=“all”其關(guān)聯(lián)的passport對象將被級聯(lián)保存
          session.save(user);

          tx.commit();
              以下代碼完成關(guān)聯(lián)對象的讀取:
          TUser user=(TUser)Hibernate.load(TUser.class,new Integer(15));
          System.out.println(
          "User name=>"+user.getName());
          System.out.println(
          "Passport Serial=>"+user.getPassport().getSerial());
              控制臺輸出:
          Hibernate:select tuser0_.id as id1_,
          from T_USER tuser0_
          left outer join
          T_PASSPORT tpassport1_ on tuser0_.id
          =tpassport1_.id
          where tuser0_.id
          =?
          User name
          =>Carin
          Passport Serial
          =>PCN759386
          Hibernate通過left outer join將T_User表及其關(guān)聯(lián)的T_Passport表同時讀入,因?yàn)榇藭r將out-join=“true”。若設(shè)置為false,則會分開讀取兩個表。

          一對多關(guān)聯(lián)
              用戶TUser和地址TAddress的一對多關(guān)聯(lián)。
              單向一對多關(guān)聯(lián)
                  主控方TUser的映射配置:
          <hibernate-mapping>
          <class
              
          name="TUser"
              table
          ="t_user"
              dynamic-update
          ="true"
              dynamic-insert
          ="true">
          .
              
          <set
                  
          name="address"
                  table
          ="t_address"
                  cascade
          ="all"
                  order-by
          ="zipcode asc">
                  
          <key column="user_id"/>
                  
          <one-to-many class="TAddress">
              
          </set>

          </class>
          </hibernate>
          被動方TAddress的記錄由Hibernate負(fù)責(zé)讀取,之后存放在主控方TUser指定的Collection類型屬性中。
          單向一對多的實(shí)現(xiàn)比較簡單,但是存在一個問題,由于是單向關(guān)聯(lián),為了保持關(guān)聯(lián)關(guān)系,我們只能通過主控方對被動方進(jìn)行級聯(lián)更新。如果被關(guān)聯(lián)方的關(guān)聯(lián)字段為“NOT NULL”,當(dāng)Hibernate創(chuàng)建或者更新時,可能出現(xiàn)約束違例。

          雙向多對一關(guān)聯(lián)
              實(shí)際上是“一對多”與“多對一”關(guān)聯(lián)的組合。也就是說我們必須在主控方配置一對多關(guān)系的基礎(chǔ)上,在被控方配置與其對應(yīng)的多對一關(guān)聯(lián)。
              TUser.hbm.xml
          <hibernate-mapping>
          <class
              
          name="TUser"
              table
          ="t_user"
              dynamic-update
          ="true"
              dynamic-insert
          ="true">
          .
              
          <set
                  
          name="address"
                  table
          ="t_address"
                  lazy
          ="false"
                  inverse
          ="true"
                  cascade
          ="all"
                  sort
          ="unsorted"
                  order-by
          ="zipcode asc">
                  
          <key column="user_id"/>
                  
          <one-to-many class="TAddress"/>
              
          </set>
          .
          </class>
          </hibernate>
          inverse="true",TUser不在作為主控方,而是將關(guān)聯(lián)關(guān)系的維護(hù)工作交給關(guān)聯(lián)對象TAddress來做。
          在one-to-many關(guān)系中,將many一方設(shè)置為主控方(inverse=“true”)將有助于性能的改善。
              TAddress.hbm.xml
          <hibernat-mapping>
          <class
              
          name="TAddress"
              table
          ="t_address"
              dynamic-update
          ="false"
              dynamic-insert
          ="false">
          .
              
          <many-to-one
                  
          name="user"
                  class
          ="TUser"
                  cascade
          ="none"
                  outer-join
          ="auto"
                  update
          ="true"
                  insert
          ="true"
                  access
          ="property"
                  column
          ="user_id"
                  not-null
          ="true"/>
          .
          </class>
          </hibernate-mapping>

          多對多關(guān)聯(lián)
          需要借助中間表來完成多對多映射信息的保存。
              由于多對多關(guān)聯(lián)的性能不佳(由于引入了中間表,一次讀取操作需要反復(fù)多次查詢),因此在設(shè)計(jì)中應(yīng)該避免大量使用。同時,在多對多關(guān)系中,應(yīng)根據(jù)情況,采取延遲加載機(jī)制來避免無謂的性能開銷。
              TGroup與TRole的多對多關(guān)聯(lián):
              TGroup.hbm.xml:
          <hibernate-mapping>
          <class
              
          name="TGroup"
              table
          ="t_group"
              dynamic-update
          ="false"
              dynamic-insert
          ="false">
          .
              
          <set
                  
          name="roles"
                  table
          ="t_group_role"
                  lazy
          ="false"
                  inverse
          ="false"
                  cascade
          ="save-update">
                  
          <key column="group_id"/>
                  
          <many-to-many
                      
          class="TRole"
                      column
          ="role_id"/>
              
          </set>
          .
          </class>
          </hibernate>
          t_group_role為t_group與t_role之間的映射表,它保存了group和role之間的映射關(guān)系。
          cascade=“save-update”,對于多對多邏輯而言,很少出現(xiàn)刪除一方需要級聯(lián)刪除所有關(guān)聯(lián)數(shù)據(jù)的情況,如刪除一個group,一般不會刪除其中包含的Role。
          column=“group_id”映射表中對于t_group表記錄的標(biāo)識字段。
           
              TRole.hbm.xml:
          <hibernate-mapping>
          <class
              
          name="TRole"
              table
          ="t_role"
              dynamic-update
          ="false"
              dynamic-insert
          ="false">
          .
              
          <set
                  
          name="groups"
                  table
          ="t_group_role"
                  lazy
          ="false"
                  inverse
          ="true"
                  cascade
          ="save-update"
                  sort
          ="unsorted">
                  
          <key column="role_id"/>
                  
          <many-to-many 
                      
          class="TGroup"
                      column
          ="group_id"
                      outer-join
          ="auto"/>
              
          </set>
          .
          </class>
          </hibernate>
          多對多關(guān)系中,由于關(guān)聯(lián)關(guān)系是兩張表相互引用,因此在保存關(guān)聯(lián)狀態(tài)時必須對雙方同時保存。
          posted on 2008-05-10 20:08 Kira-2006 閱讀(555) 評論(0)  編輯  收藏 所屬分類: hibernate
          主站蜘蛛池模板: 青冈县| 揭东县| 鄂伦春自治旗| 泽州县| 宝鸡市| 丽水市| 冷水江市| 乌鲁木齐市| 胶州市| 田阳县| 肥乡县| 临汾市| 仙居县| 扬中市| 武陟县| 凤翔县| 中山市| 西华县| 汝南县| 徐汇区| 松江区| 微博| 枝江市| 新建县| 高尔夫| 恩平市| 肃宁县| 修武县| 丰宁| 济源市| 岳普湖县| 灵山县| 佛教| 巴彦淖尔市| 刚察县| 海门市| 皋兰县| 高雄市| 句容市| 延寿县| 瑞金市|