多對多關係
員工表 和角色表 一個員工能夠對應多個角色 一個角色下面也能對應多個員工
表中的表達
實體類中的表達
創建實體類
通過set集合關聯表關係
package cn.ycsj.domain;
import java.util.HashSet;
import java.util.Set;
public class User {
private Long user_id;
private String user_code;
private String user_name;
private String user_password;
private Character user_state;
private Set<Role> roles = new HashSet<Role>();
public Long getUser_id() {
return user_id;
}
public void setUser_id(Long user_id) {
this.user_id = user_id;
}
public String getUser_code() {
return user_code;
}
public void setUser_code(String user_code) {
this.user_code = user_code;
}
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;
}
public Character getUser_state() {
return user_state;
}
public void setUser_state(Character user_state) {
this.user_state = user_state;
}
public Set<Role> getRoles() {
return roles;
}
public void setRoles(Set<Role> roles) {
this.roles = roles;
}
}
配置文件
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
<hibernate-mapping package="cn.ycsj.domain" >
<class name="User" table="sys_user" >
<id name="user_id" >
<generator class="native"></generator>
</id>
<property name="user_code"></property>
<property name="user_name"></property>
<property name="user_password"></property>
<property name="user_state"></property>
<!--多對多關係表達-->
<!-- name 集合屬性名
table 配置中間表名
key元素下的column 外鍵 別人引用我的外鍵
manytomany
class 我與那個類是多對多關係
column 外鍵 我引用別人的外鍵列
-->
<set name="roles" table="sys_user_role">
<key column="user_id"></key>
<many-to-many class="Role" column="role_id"></many-to-many>
</set>
</class>
</hibernate-mapping>
角色表
package cn.ycsj.domain;
import java.util.HashSet;
import java.util.Set;
public class Role {
private Long role_id;
private String role_name;
private String role_memo;
private Set<User> users = new HashSet<User>();
public Long getRole_id() {
return role_id;
}
public void setRole_id(Long 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;
}
public Set<User> getUsers() {
return users;
}
public void setUsers(Set<User> users) {
this.users = users;
}
}
配置文件
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
<hibernate-mapping package="cn.ycsj.domain" >
<class name="Role" table="sys_role" >
<id name="role_id" >
<generator class="native"></generator>
</id>
<property name="role_name"></property>
<property name="role_memo"></property>
<!--多對多關係表達-->
<!-- name 集合屬性名
table 配置中間表名
key元素下的column 外鍵 別人引用我的外鍵
manytomany
class 我與那個類是多對多關係
column 外鍵 我引用別人的外鍵列
-->
<set name="users" table="sys_user_role">
<key column="role_id"></key>
<many-to-many class="User" column="user_id"></many-to-many>
</set>
</class>
</hibernate-mapping>
添加掃描到主配置文件
隨便運行一段程序,hibernate會自動生成表結構
操作
public void func(){
//1.獲得session
Session session = HibernateUtils.getCurrentSession();
//2.開啓事務
Transaction tx = session.beginTransaction();
//3.操作
//創建user和role
User user1 = new User();
User user2 = new User();
Role r1 = new Role();
Role r2 = new Role();
user1.setUser_name("xxx");
user2.setUser_name("yyy");
r1.setRole_name("總經理");
r2.setRole_name("祕書");
//user關係表達
user1.getRoles().add(r1);
user1.getRoles().add(r2);
user2.getRoles().add(r2);
//role關係表達
/* r1.getUsers().add(user1);
r2.getUsers().add(user1);
r2.getUsers().add(user2);*/
//調用save方法
session.save(user1);
session.save(user2);
session.save(r1);
session.save(r2);
//4.提交事務
tx.commit();
在紅色部分沒有註釋時會報錯,因爲兩張表在執行的時候都需要維護關係,向中間表sys_user_role中插入數據,出現異常
解決方法1 註釋掉role關係表達
解決方式2 向role.hbm.xml中位置調價inverse屬性
-->
<!--使用inverse屬性
true放棄維護關係
false 維護
結論在開發中 無論遇到多對多 一對多關係,都要一方放棄維護關係
根據業務關係來確定哪一方來放棄維護
比如錄入員工 需要指定所屬角色 那麼業務方向就是員工維護,角色需要放棄維護關係
-->
<set name="users" table="sys_user_role" inverse="true">
<key column="role_id"></key>
<many-to-many class="User" column="user_id"></many-to-many>
</set>
爲用戶添加角色
/**
* 爲用戶增加一個角色
*/
@Test
public void func1(){
//1.獲得session
Session session = HibernateUtils.getCurrentSession();
//2.開啓事務
Transaction tx = session.beginTransaction();
//3.操作
User user = session.get(User.class, 1l); //持久化狀態
//創建角色
Role r1 = new Role(); //瞬時狀態
r1.setRole_name("保安");
user.getRoles().add(r1);
//將角色裝換爲持久化狀態
session.save(r1);//將瞬時狀態裝換爲持久化狀態
//4.提交事務
tx.commit();
}
配置級聯屬性
該屬性不建議使用
user.hbm.xml中
<set name="roles" table="sys_user_role" cascade="save-update">
<key column="user_id"></key>
<many-to-many class="Role" column="role_id"></many-to-many>
</set>
上面的代碼能省略session.save(r1) 級聯屬性幫助保存持久化狀態下的瞬時狀態。
/** * 爲用戶刪除一個角色 */ @Test public void func2(){ //1.獲得session Session session = HibernateUtils.getCurrentSession(); //2.開啓事務 Transaction tx = session.beginTransaction(); //3.操作 User user = session.get(User.class, 1l); //持久化狀態 Role role = session.get(Role.class,2l); //將角色從用戶中移除 user.getRoles().remove(role); //將用戶主從角色中移除 role.getUsers().remove(user); //4.提交事務 tx.commit(); }