Hibernate中多對多配置及操作
阿新 • • 發佈:2019-01-10
在兩張表的多對多操作時,要建立第三張表,至少有兩個欄位作為外來鍵,指向另外兩個表的主鍵。
表的多對多對映配置
以使用者和角色為例子
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);