激情久久久_欧美视频区_成人av免费_不卡视频一二三区_欧美精品在欧美一区二区少妇_欧美一区二区三区的

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

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

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 欧美精品一区自拍a毛片在线视频 | 一级毛片免费一级 | 午夜免费一区 | 亚洲一区二区观看播放 | 一区二区网 | 自拍偷拍999 | 中文在线国产 | 女人裸体让男人桶全过程 | 国产免费久久久久 | 91高清网站| 久久久久久久久久91 | 亚洲视频综合 | 中文字幕一区二区三区久久 | 99这里精品| 91精品国产91 | 亚洲综人网 | 日本欧美一区二区三区在线观看 | 天堂精品久久 | 久久九九热re6这里有精品 | 国产一国产精品一级毛片 | 亚洲无av | 日韩毛片网 | 国产精品久久久久久久久久久久午夜 | 欧美激情天堂 | 欧美综合在线观看视频 | 国产成年人小视频 | 欧美日韩在线视频一区 | 91精品国产91久久久久久蜜臀 | 国产女同玩人妖 | 欧美一区二区三区中文字幕 | 欧美日韩免费看 | 亚洲视频精品在线 | 免费一级欧美大片视频 | 黄色大片网 | 国产一级伦理片 | 色播视频在线播放 | 国产精品成人免费一区久久羞羞 | 欧美激情视频一区二区免费 | 国产精品99久久久久久久 | 成人一级视频在线观看 | 女女久久 |