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

          一對一關聯
              主鍵關聯:
          即兩張表通過主鍵形成一對一映射關系。

              用戶TUser與護照TPassport關聯
              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"表示級聯關系設置為“all”,即無論主空房執行任何操作,都會關聯類執行相同的操作。

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

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

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

          //相互設置關聯
          passport.setUser(user);
          user.setPassport(passport);

          Transaction tx 
          = sessioin.beginTransaction();
          //由于TUser類的one-to-one節點被設置成
          //cascade=“all”其關聯的passport對象將被級聯保存
          session.save(user);

          tx.commit();
              以下代碼完成關聯對象的讀取:
          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表及其關聯的T_Passport表同時讀入,因為此時將out-join=“true”。若設置為false,則會分開讀取兩個表。

          一對多關聯
              用戶TUser和地址TAddress的一對多關聯。
              單向一對多關聯
                  主控方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負責讀取,之后存放在主控方TUser指定的Collection類型屬性中。
          單向一對多的實現比較簡單,但是存在一個問題,由于是單向關聯,為了保持關聯關系,我們只能通過主控方對被動方進行級聯更新。如果被關聯方的關聯字段為“NOT NULL”,當Hibernate創建或者更新時,可能出現約束違例。

          雙向多對一關聯
              實際上是“一對多”與“多對一”關聯的組合。也就是說我們必須在主控方配置一對多關系的基礎上,在被控方配置與其對應的多對一關聯。
              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不在作為主控方,而是將關聯關系的維護工作交給關聯對象TAddress來做。
          在one-to-many關系中,將many一方設置為主控方(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>

          多對多關聯
          需要借助中間表來完成多對多映射信息的保存。
              由于多對多關聯的性能不佳(由于引入了中間表,一次讀取操作需要反復多次查詢),因此在設計中應該避免大量使用。同時,在多對多關系中,應根據情況,采取延遲加載機制來避免無謂的性能開銷。
              TGroup與TRole的多對多關聯:
              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之間的映射關系。
          cascade=“save-update”,對于多對多邏輯而言,很少出現刪除一方需要級聯刪除所有關聯數據的情況,如刪除一個group,一般不會刪除其中包含的Role。
          column=“group_id”映射表中對于t_group表記錄的標識字段。
           
              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>
          多對多關系中,由于關聯關系是兩張表相互引用,因此在保存關聯狀態時必須對雙方同時保存。
          posted on 2008-05-10 20:08 Kira-2006 閱讀(553) 評論(0)  編輯  收藏 所屬分類: hibernate
          主站蜘蛛池模板: 安徽省| 九龙县| 郓城县| 绿春县| 玉田县| 高碑店市| 衡阳市| 遂溪县| 黑河市| 基隆市| 汉川市| 高阳县| 万载县| 涞水县| 梁山县| 延川县| 沁源县| 若尔盖县| 乐平市| 昔阳县| 汨罗市| 兴宁市| 同德县| 长汀县| 南充市| 广安市| 富蕴县| 巴马| 弥勒县| 宣威市| 驻马店市| 洪江市| 师宗县| 浦北县| 巴南区| 武平县| 张北县| 巨野县| 广宗县| 十堰市| 定襄县|