一区二区三区在线-一区二区三区亚洲视频-一区二区三区亚洲-一区二区三区午夜-一区二区三区四区在线视频-一区二区三区四区在线免费观看

服務器之家:專注于服務器技術及軟件下載分享
分類導航

PHP教程|ASP.NET教程|Java教程|ASP教程|編程技術|正則表達式|C/C++|IOS|C#|Swift|Android|VB|R語言|JavaScript|易語言|vb.net|

服務器之家 - 編程語言 - Java教程 - java Hibernate多對多映射詳解及實例代碼

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

2020-07-29 14:30java教程網 Java教程

這篇文章主要介紹了java Hibernate多對多映射詳解及實例代碼的相關資料,需要的朋友可以參考下

java Hibernate多對多映射

前言:

一、單向多對多

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

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

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

代碼部分: 

(1)映射和關系類

因為是單向的關系,所以只需要在一端進行維護,所以我們需要在User.hbm.xml配置文件中添加<many-to-many>標簽,并在標簽中加上對應的列關系,在<set>表中添加table屬性來指明生成新表,User.hbm.xml代碼如下:

?
1
2
3
4
5
6
7
8
9
10
11
12
<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代碼比較簡單,不需要添加多余的標簽來維護關系:

?
1
2
3
4
5
6
7
8
<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.java代碼如下:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
<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>

Role.java代碼如下:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
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值,和之前的映射一樣的道理。

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
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的內容。代碼如下:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
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);
    }
  }

二、雙向多對多映射

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

     因為是雙向的所以需要同時加入雙向的集合映射,在配置文件中添加<set>標簽,添加多對多標簽,Role.hbm.xml代碼如下:

?
1
2
3
4
5
6
7
8
9
10
11
12
<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>

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

?
1
2
3
4
5
6
7
8
9
10
11
12
13
<span style="font-family:KaiTi_GB2312;font-size:18px;"><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>
</span>

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

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
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代碼和上文中的代碼相同,就不全部放上來了。

小結:

      單向和多向通過幾篇博客的介紹相信大家已經明白,我們只需要記住單向的雙向的也就會了,挺簡單的。

感謝閱讀,希望能幫助到大家,謝謝大家對本站的支持!

原文鏈接:http://blog.csdn.net/ww130929/article/details/54313397

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 国产丰满美女做爰 | 亚洲成av人片天堂网 | spank日本网站脱裤子打屁股 | 日韩大片免费看 | 欧美精品一区二区三区久久 | 丝袜足液精子免费视频 | 国产在线视频第一页 | 国色天香视频完整版 | 99re这里只有精品视频在线观看 | 男人的天堂久久精品激情 | 日韩激情视频在线观看 | 欧美日韩一区二区三区在线视频 | 精品久久久久中文字幕日本 | 国产1广场舞丰满老女偷 | 天天久久综合网站 | 久久re热在线视频精99 | 国产精品国产精品国产三级普 | 国产精品日韩欧美一区二区三区 | 美女脱一净二净不带胸罩 | 美女被吸乳老师羞羞漫画 | 日韩一级在线观看 | 欧美同性猛男野外gay免费 | 99久久免费国产香蕉麻豆 | avav一区 | 国产成人精品系列在线观看 | 腿交hd| 日韩高清一区二区三区不卡 | 免费国产一级观看完整版 | 欧洲美女女同 | 成人高清视频在线观看 | 二次元美女内裤凹陷太深 | 99精彩免费观看 | 污污免费| 国产a不卡片精品免费观看 国产aaa伦理片 | 久草热8精品视频在线观看 久草草在线视视频 | 九九艹 | 亚洲AV蜜桃永久无码精品无码网 | 精品日韩欧美一区二区三区在线播放 | 精品国产一级在线观看 | 狠狠色成人综合 | 日本精品久久久久久久久免费 |