Hibernate 學習筆記 之 多對多關係 及其 級聯操作
阿新 • • 發佈:2019-02-05
一、多對多配置
User.java
/**
* Created by Donald on 2016/11/20.
*/
public class User {
private Integer user_id; //使用者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;
}
}
Role.java
/**
* Created by Donald on 2016/11/20.
*/
public class Role {
private Integer role_id; //角色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;
}
}
User.hbm.xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Configuration DTD 3.0//EN"
"http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
<hibernate-mapping>
<!-- 1.配置類和表對應
class標籤
name屬性,實體類
table屬性,資料表名稱
-->
<class name="com.yyf.manytomany.User" table="t_user">
<id name="user_id" column="user_id">
<generator class="native"></generator>
</id>
<property name="user_name" column="user_name" ></property>
<property name="user_password" column="user_password"></property>
<set name="setRole" table="user_role">
<key column="userid"></key>
<!--
class,角色實體類全路徑
column,角色在第三張表外來鍵名稱
-->
<many-to-many class="com.yyf.manytomany.Role" column="roleid"/>
</set>
</class>
</hibernate-mapping>
Role.hbm.xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Configuration DTD 3.0//EN"
"http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
<hibernate-mapping>
<!-- 1.配置類和表對應
class標籤
name屬性,實體類
table屬性,資料表名稱
-->
<class name="com.yyf.manytomany.Role" table="t_Role">
<id name="role_id" column="role_id">
<generator class="native"></generator>
</id>
<property name="role_name" column="role_name" ></property>
<property name="role_memo" column="role_memo"></property>
<set name="setUser" table="user_role">
<key column="roleid"></key>
<many-to-many class="com.yyf.manytomany.User" column="userid"/>
</set>
</class>
</hibernate-mapping>
二、級聯操作—-儲存
若無save-update則儲存不成功。
測試:
/**
* 新增兩個使用者,為每個使用者新增兩個角色
*/
@Test
public void testSave() {
SessionFactory sessionFactory = null;
Session session = null;
Transaction tx = null;
try{
sessionFactory = HibernateUtils.getSessionFactory();
session = sessionFactory.openSession();
tx = session.beginTransaction();
User user1 = new User();
user1.setUser_name("lucy");
user1.setUser_password("123");
User user2 = new User();
user2.setUser_name("mary");
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("保安");
//2. 建立關係,把角色放到使用者裡面
//user1 ----r1/r2
user1.getSetRole().add(role1);
user1.getSetRole().add(role2);
//user2 ----r2/r3
user2.getSetRole().add(role2);
user2.getSetRole().add(role3);
//3.儲存使用者
session.save(user1);
session.save(user2);
tx.commit();
}catch (Exception e){
tx.rollback();
}
}
三、級聯操作—-刪除
這種刪除會將關聯的所有的資料刪除
@Test
public void testDelete2() {
SessionFactory sessionFactory = null;
Session session = null;
Transaction tx = null;
try{
sessionFactory = HibernateUtils.getSessionFactory();
session = sessionFactory.openSession();
tx = session.beginTransaction();
User user = session.get(User.class, 3);
session.delete(user);
tx.commit();
}catch (Exception e){
tx.rollback();
}
}
四、級聯操作—-維護第三張表
其實主要操作set
/**
* 1.使用者和角色多對多關係,維護關係通過第三張表維護
*
* 2.讓某個使用者有某個角色
* ① 根據id查詢使用者和角色
* ②把角色物件放到使用者set集合
*
* 3.讓某個使用者沒有某個角色
* ①根據id查詢使用者和角色
* ②從使用者裡面把角色去掉
*
*/
@Test
public void testOperator() {
SessionFactory sessionFactory = null;
Session session = null;
Transaction tx = null;
try{
sessionFactory = HibernateUtils.getSessionFactory();
session = sessionFactory.openSession();
tx = session.beginTransaction();
/**
* 讓某個使用者有某個角色
* 讓lucy有經紀人角色
*
* 1.查詢lucy和經濟人
* 2.放入user的set裡
*/
// User lucy = session.get(User.class, 1);
// Role role = session.get(Role.class, 1);
//
// lucy.getSetRole().add(role);
/**
* 刪除操作
*/
User user = session.get(User.class, 4);
Role role = session.get(Role.class, 3);
user.getSetRole().remove(role);
tx.commit();
}catch (Exception e){
tx.rollback();
}
}