1. 程式人生 > >Hibernate中多對多配置及操作

Hibernate中多對多配置及操作

在兩張表的多對多操作時,要建立第三張表,至少有兩個欄位作為外來鍵,指向另外兩個表的主鍵。

表的多對多對映配置

以使用者和角色為例子

1、建立實體類,使用者和角色實體類

2、讓兩個實體類互相進行表示

- 一個使用者有多個角色,使用set集合

- 一個角色有多個使用者,也使用set集合

使用者實體類:

package com.demo.entity;

import java.util.HashSet;
import java.util.Set;

//使用者實體類

public class User {
	private Integer user_id;
	private String user_name;
	private String user_password;
	
	//一個使用者可以有多個角色
	private Set<Role> setRole = new HashSet<Role>();
	
	public Set<Role> getSetRole() {
		return setRole;
	}
	public void setSetRole(Set<Role> setRole) {
		this.setRole = setRole;
	}
	public Integer getUser_id() {
		return user_id;
	}
	public void setUser_id(Integer user_id) {
		this.user_id = user_id;
	}
	public String getUser_name() {
		return user_name;
	}
	public void setUser_name(String user_name) {
		this.user_name = user_name;
	}
	public String getUser_password() {
		return user_password;
	}
	public void setUser_password(String user_password) {
		this.user_password = user_password;
	}
	
	
}

角色實體類:

package com.demo.entity;

import java.util.HashSet;
import java.util.Set;

//角色實體類

public class Role {
	private Integer role_id;
	private String role_name;
	private String role_memo;//角色描述
	
	//一個角色可以有多個使用者
	private Set<User> setUser = new HashSet<User>();
	
	public Set<User> getSetUser() {
		return setUser;
	}
	public void setSetUser(Set<User> setUser) {
		this.setUser = setUser;
	}
	public Integer getRole_id() {
		return role_id;
	}
	public void setRole_id(Integer role_id) {
		this.role_id = role_id;
	}
	public String getRole_name() {
		return role_name;
	}
	public void setRole_name(String role_name) {
		this.role_name = role_name;
	}
	public String getRole_memo() {
		return role_memo;
	}
	public void setRole_memo(String role_memo) {
		this.role_memo = role_memo;
	}
	
	
}

3、配置對映關係

- 基本配置

- 配置多對多關係

-- 在使用者中表示所有角色,使用set標籤

使用者(User)實體類對映配置檔案:

-- 在角色中表示所有使用者 ,也使用set標籤
角色(Role)實體類對映配置檔案:

set標籤配置重點:當前配置檔案中的key標籤中column屬性表示的是自己對應第三張表中的外來鍵名稱,many-to-many標籤中column屬性表示的是當前表關聯的那張表在第三張表中的外來鍵名稱

4、在核心配置檔案中引入對映檔案

<!-- 第三部分:把對映檔案放到核心配置檔案中 -->
			<mapping resource="com/demo/entity/User.hbm.xml"/>
			<mapping resource="com/demo/entity/Role.hbm.xml"/>

多對多級聯操作

級聯儲存

- 根據使用者儲存角色,一個使用者可以有多個不同的角色

(1)在使用者(User)對映配置檔案中的set標籤中設定cascade屬性,值為save-update

 <set name="setRole" table="t_user_role" cascade="save-update">

(2)程式碼測試

-- 建立使用者和角色物件,將角色物件儲存到使用者物件中去,最終用session儲存使用者物件

//測試多對多級聯儲存
	@Test
	public void testSave(){
		Session session = null;
		Transaction tx = null;
		
		try{
			session = HibernateUtils.getSession();
			tx = session.beginTransaction();
			
			//建立使用者和角色物件
			User user1 = new User();
			user1.setUser_name("張三");
			user1.setUser_password("123");
			User user2 = new User();
			user2.setUser_name("李四");
			user2.setUser_password("456");
			
			Role role1 = new Role();
			role1.setRole_name("老闆");
			role1.setRole_memo("老闆就是老闆");
			Role role2 = new Role();
			role2.setRole_name("保安");
			role2.setRole_memo("保安就是保安");
			Role role3 = new Role();
			role3.setRole_name("祕書");
			role3.setRole_memo("祕書就是祕書");
			
			//建立關係,把角色物件放到使用者裡
			//user1對應role1和role2兩個角色,user2對應role2和role3兩個角色,到達模擬出多對多關係的效果
			user1.getSetRole().add(role1);
			user1.getSetRole().add(role2);
			user2.getSetRole().add(role2);
			user2.getSetRole().add(role3);
			
			//儲存使用者物件
			session.save(user1);
			session.save(user2);
			
			tx.commit();
		}
		catch(Exception e){
			tx.rollback();
		}
		finally{
			session.close();
		}
	}

測試角色中儲存使用者操作與之類似

級聯刪除

- 刪除一個使用者和該使用者對應的所有角色

(1)在set標籤的cascade屬性中新增delete

<set name="setRole" table="t_user_role" cascade="save-update,delete">

(2)刪除使用者物件

 

//測試多對多級聯刪除
	@Test
	public void testDelete(){
		Session session = null;
		Transaction tx = null;
		
		try{
			session = HibernateUtils.getSession();
			tx = session.beginTransaction();
			
			//獲取使用者物件
			User user1 = session.get(User.class, 1);
			
			//刪除所獲取的使用者物件
			session.delete(user1);
			
			tx.commit();
		}
		catch(Exception e){
			tx.rollback();
		}
		finally{
			session.close();
		}
	}

結果發現:所獲取的使用者物件user1所對應的所有角色role1和role2都被刪除了,但與此同時,原來表中的user2物件所對應的角色role2和role3只剩下了role3,因為在聯級刪除時直接刪除了角色(Role)表中的role2物件,所以user2的對應關係被破壞了

維護第三張表關係

為了解決上面所述的問題,我們只用操作第三張表,來維護使用者(User)和角色(Role)之間的關係,不用去操作使用者表和角色表。

- 為某個使用者新增角色

(1)根據id查詢使用者和角色物件

(2)將角色物件新增到使用者物件的set集合中

                        //查詢出user1
			User user1 = session.get(User.class, 1);
			//查詢出role3
			Role role3 = session.get(Role.class, 3);
			//給user1加入role3角色,將角色加入到使用者的set集合中去
			user1.getSetRole().add(role3);

- 為某個使用者刪除角色

(1)根據id查詢使用者和角色物件

(2)將角色物件從使用者的set集合中刪除

                        //查詢出user1
			User user1 = session.get(User.class, 1);
			//查詢出role2
			Role role2 = session.get(Role.class, 2);
			//從user1的角色集合中刪除role2
			user1.getSetRole().remove(role2);