天天看點

多對多關聯映射(雙向)

     關聯映射方面的最後一篇了,我覺得映射檔案的編寫是使用hibernate的基礎,而關聯映射又是基礎的基礎,是以這方面分的細一些,羅嗦一些,說明白就好,呵呵。

     多對多關聯(雙向),相對單向,在實體上就是一端也保持另一端的對象集合,在映射檔案中也配置上。但是要注意兩邊配置檔案中指定的外鍵一定要對應。

1.對象模型:

2.關系模型:

3.實體類:

  Player.java

public class Player { 

  private Integer id; 

  private String name; 

  private Set<Role> roles; 

  //一系列的setter.getter方法 

  @Override 

  public String toString() { 

    return "Player: " + name; 

  } 

}

  Role.java

public class Role { 

  private Set<Player> players; 

    return "Role: " + name; 

4.映射檔案:

  Player.hbm.xml

  <class name="com.sxt.hibernate.many2many.entity.Player" table="sxt_hibernate_player"> 

    <id name="id" length="4"> 

      <generator class="native"></generator> 

    </id> 

    <property name="name" length="10"></property> 

    <!--table="sxt_hibernate_user_role"含義,用來指定中間表    --> 

    <set name="roles" table="sxt_hibernate_player_role" cascade="save-update"> 

      <!--<key column="user_id">含義,指定中間表中用來指向本表的外鍵    --> 

      <key column="player_id"></key> 

      <!-- column含義,用來指定中間表中用來指向另一端表的外鍵 --> 

      <many-to-many class="com.sxt.hibernate.many2many.entity.Role" column="role_id"></many-to-many> 

    </set> 

  </class>

  Role.hbm.xml

  <class name="com.sxt.hibernate.many2many.entity.Role" table="sxt_hibernate_role"> 

    <set name="players" table="sxt_hibernate_player_role" cascade="save-update"> 

      <!-- 注意這裡指定的外鍵要和另一端映射檔案中的相對應 --> 

      <key column="role_id"></key> 

      <many-to-many class="com.sxt.hibernate.many2many.entity.Player" column="player_id"></many-to-many> 

5.hibernate配置檔案:

  參照上一篇。

6. 測試方法:

  public static void main(String[] args) { 

    Session session = HibernateUtils.getSession(); 

    Transaction t = session.beginTransaction(); 

    try { 

      /** 

        * 測試插入資料 

        */        

/*      Player player1=new Player(); 

      player1.setName("姚明"); 

      Player player2=new Player(); 

      player2.setName("詹姆斯"); 

      Player player3=new Player(); 

      player3.setName("科比"); 

      Role role1=new Role(); 

      role1.setName("中鋒"); 

      Set<Player> players1=new HashSet<Player>(); 

      players1.add(player1); 

      players1.add(player2); 

      role1.setPlayers(players1); 

      Role role2=new Role(); 

      role2.setName("後衛"); 

      Set<Player> players2=new HashSet<Player>(); 

      players2.add(player2); 

      players2.add(player3); 

      role2.setPlayers(players2); 

      session.save(role1); 

      session.save(role2);*/ 

        * 測試加載資料 

        */ 

      Role role=(Role)session.load(Role.class, 4); 

      System.out.println(role); 

      for(Iterator<Player> players=role.getPlayers().iterator();players.hasNext();){ 

        System.out.println(players.next()); 

      } 

      t.commit(); 

    } catch (HibernateException e) { 

      e.printStackTrace(); 

      t.rollback(); 

    } finally { 

      HibernateUtils.closeSession(session); 

    } 

     本文轉自NightWolves 51CTO部落格,原文連結:http://blog.51cto.com/yangfei520/276187,如需轉載請自行聯系原作者