首頁  >  文章  >  Java  >  java Hibernate多對多映射詳解及實例程式碼

java Hibernate多對多映射詳解及實例程式碼

高洛峰
高洛峰原創
2017-01-23 11:43:341108瀏覽

java Hibernate多對多映射

前言:

一、單向多對多

    單向多對多的例子用人和職位來舉例,一個人可以有多個職位,一個職位會有多個人。單向多對多是指只能在一端來查詢取得另一端的內容。多對多的關係在產生關係模型時會產生物件先前的關聯表,關聯表中存放著兩個關係表的主鍵,它們的關係如下:

java Hibernate多对多映射详解及实例代码

java Hibernate多对多映射详解及实例代码

程式碼部分: 

程式碼部分: 

程式碼部分: 

(1)映射和關係類別

因為是單向的關係,所以只需要在一端進行維護,所​​以我們需要在User.hbm.xml設定檔中加入標籤,並在標籤中加上對應的列關係,在表中加入table屬性來指明產生新表,User.hbm.xml程式碼如下:

<span style="font-family:KaiTi_GB2312;font-size:18px;"><hibernate-mapping>
  <class name="com.bjpowernode.hibernate.User" table="t_user">
    <id name="id">
      <generator class="native"/>
    </id>
    <property name="name"/>
    <set name="roles" table="t_user_role">
      <key column="user_id"/>
      <many-to-many class="com.bjpowernode.hibernate.Role" column="role_id" /> 
    </set>
  </class>
</hibernate-mapping></span>

   

Role.hbm.xml程式碼比較簡單,不需要增加多餘的標籤來維護關係:

<hibernate-mapping>
  <class name="com.bjpowernode.hibernate.Role" table="t_role">
    <id name="id">
      <generator class="native"/>
    </id>
    <property name="name"/>
  </class>
</hibernate-mapping>

   

因為user的映射中有set映射,所以需要在對應的類別文件中加入Hashset,User.代碼如下:

<span style="font-family:KaiTi_GB2312;font-size:18px;">import java.util.Set;
  
public class User {
    
  private int id;
    
  private String name;
  
  private Set roles;
    
  public int getId() {
    return id;
  }
  
  public void setId(int id) {
    this.id = id;
  }
  
  public String getName() {
    return name;
  }
  
  public void setName(String name) {
    this.name = name;
  }
  
  public Set getRoles() {
    return roles;
  }
  
  public void setRoles(Set roles) {
    this.roles = roles;
  }
}</span>
ole

   如下:

public class Role {
  
  private int id;
    
  private String name;
    
  public int getId() {
    return id;
  }
  
  public void setId(int id) {
    this.id = id;
  }
  
  public String getName() {
    return name;
  }
  
  public void setName(String name) {
    this.name = name;
  }
}

   

(2)新增和讀取資料:

進行新增資料時,需要先吧關係儲存到資料庫中,然後建立使用者Hash表,在hash表中加入對應的關係,最後建立用戶,將hash表添加到用戶上。這部分要注意的是寫入的先後順序,否則會出現很多null值,跟之前的映射一樣的道理。

public void testSave1() {
    Session session = null;
    try {
      session = HibernateUtils.getSession();
      session.beginTransaction();
        
      Role r1 = new Role();
      r1.setName("数据录入人员");
      session.save(r1);
        
      Role r2 = new Role();
      r2.setName("商务主管");
      session.save(r2);
        
      Role r3 = new Role();
      r3.setName("商务经理");
      session.save(r3);
        
      Role r4 = new Role();
      r4.setName("项目会计");
      session.save(r4);
        
      User u1 = new User();
      u1.setName("张三");
      Set u1Roles = new HashSet();
      u1Roles.add(r1);
      u1Roles.add(r2);
      u1.setRoles(u1Roles);
      session.save(u1);
        
      User u2 = new User();
      u2.setName("李四");
      Set u2Roles = new HashSet();
      u2Roles.add(r1);
      u2Roles.add(r2);
      u2Roles.add(r3);
      u2.setRoles(u2Roles);
      session.save(u2);
        
      User u3 = new User();
      u3.setName("王五");
      Set u3Roles = new HashSet();
      u3Roles.add(r3);
      u3Roles.add(r4);
      u3.setRoles(u3Roles);
      session.save(u3);
        
      session.getTransaction().commit();
    }catch(Exception e) {
      e.printStackTrace();
      session.getTransaction().rollback();
    }finally {
      HibernateUtils.closeSession(session);
    }
  }

 

讀取時因為是單向關係,只需要透過一來讀取另一端的內容,透過user來讀取role的內容。程式碼如下:

public void testLoad1() {
    Session session = null;
    try {
      session = HibernateUtils.getSession();
      session.beginTransaction();
      User user = (User)session.load(User.class, 2);
      System.out.println(user.getName());
      for (Iterator iter=user.getRoles().iterator(); iter.hasNext();) {
        Role role = (Role)iter.next();
        System.out.println(role.getName());
      }
      session.getTransaction().commit();
    }catch(Exception e) {
      e.printStackTrace();
      session.getTransaction().rollback();
    }finally {
      HibernateUtils.closeSession(session);
    }
  }

二、雙向多對多重映射

​​   和之前介紹的一樣,雙向多對多就是在兩端同時維護關係,從任何一端都能加載到另一端的內容,話不多說直接上程式碼:

     因為是雙向的所以需要同時加入雙向的集合映射,在設定檔中加入標籤,新增多對多標籤,Role.hbm.xml程式碼如下:

<hibernate-mapping>
  <class name="com.bjpowernode.hibernate.Role" table="t_role">
    <id name="id">
      <generator class="native"/>
    </id>
    <property name="name"/>
    <set name="users" table="t_user_role">
      <key column="role_id" not-null="true"/>
      <many-to-many class="com.bjpowernode.hibernate.User" column="user_id"/>
    </set>
  </class>
</hibernate-mapping>

.hbm.xml程式碼如下,和單向映射程式碼是一樣的:

<hibernate-mapping>
  <class name="com.bjpowernode.hibernate.Role" table="t_role">
    <id name="id">
      <generator class="native"/>
    </id>
    <property name="name"/>
    <set name="users" table="t_user_role">
      <key column="role_id" not-null="true"/>
      <many-to-many class="com.bjpowernode.hibernate.User" column="user_id"/>
    </set>
  </class>
</hibernate-mapping>

Role.java部分,和單向的user.java一樣需要加入集合映射set,程式碼如下:

import java.util.Set;
  
public class Role {
  
  private int id;
    
  private String name;
    
  private Set users;
    
  public int getId() {
    return id;
  }
  
  public void setId(int id) {
    this.id = id;
  }
  
  public String getName() {
    return name;
  }
  
  public void setName(String name) {
    this.name = name;
  }
  
  public Set getUsers() {
    return users;
  }
  
  public void setUsers(Set users) {
    this.users = users;
  }
}

   User.hbm.xml和User.java程式碼和上文的程式碼相同,就不會全部放上來了。

小結:

      單向和多向透過幾個部落格的介紹相信大家已經明白,我們只需要記住單向的雙向的也就會了,挺簡單的。

🎜🎜感謝閱讀,希望能幫助大家,謝謝大家對本站的支持! 🎜🎜更多java Hibernate多對多映射詳解及實例代碼相關文章請關注PHP中文網! 🎜
陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn