天天看點

多對多關聯映射(單向)

       多對多其實是個很複雜的關系,hibernate在進行處理的時候借助中間表或者中間類。中間表是在映射檔案的關聯标簽(比如集合标簽<set>)中由table屬性指定的由hibernate自動生成的表,它隻有兩個字段,分别由<key>和<many-to-many>标簽的table屬性指定,作為外鍵分别用來指向關聯雙方表的主鍵。中間類就是把我們的中間表抽象生成一個實體類,在映射的時候分别和兩個關聯類構成一對多的關系,即演變成兩個一對多來處理。

        我習慣使用中間表的方式。

1.實體模型:

2.關系模型:

3.實體類:

  Role.java

public class Role { 

  private Integer id; 

  private String name; 

  //一系列的setter.getter方法 

  @Override 

  public String toString() { 

    return "Role:" + name; 

  } 

}

   Player.java

public class Player { 

  private Set<Role> roles; 

    return "Player:" + name; 

4.映射檔案:

  Role.hbm.xml

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

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

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

    </id> 

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

  </class>

   Player.hbm.xml

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

    <!--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> 

5.hibernate配置檔案:

   參見上一篇。

6.測試方法:

  public static void main(String[] args) { 

    Session session = HibernateUtils.getSession(); 

    Transaction t = session.beginTransaction(); 

    try { 

      /** 

        * 測試插入資料 

        */ 

/*      Role role1=new Role(); 

      role1.setName("後衛"); 

      Role role2=new Role(); 

      role2.setName("前鋒"); 

      Role role3=new Role(); 

      role3.setName("中鋒"); 

      Player player1=new Player(); 

      player1.setName("姚明"); 

      Set<Role> roles1=new HashSet<Role>(); 

      roles1.add(role3); 

      player1.setRoles(roles1); 

      Player player2=new Player(); 

      player2.setName("詹姆斯"); 

      Set<Role> roles2=new HashSet<Role>(); 

      roles2.add(role1); 

      roles2.add(role2); 

      roles2.add(role3); 

      player2.setRoles(roles2); 

      //能正确儲存.每儲存player後,都要級聯儲存它的role,并且級聯插入中間表記錄. 

      session.save(player1); 

      session.save(player2);*/ 

        * 測試加載資料 

      Player player=(Player)session.load(Player.class, 1); 

      System.out.println(player); 

      for(Iterator<Role> iterator=player.getRoles().iterator();iterator.hasNext();){ 

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

      } 

      t.commit(); 

    } catch (HibernateException e) { 

      e.printStackTrace(); 

      t.rollback(); 

    } finally { 

      HibernateUtils.closeSession(session); 

    } 

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