Hibernate多對多關聯關係對映
阿新 • • 發佈:2019-01-10
核心程式碼
多表只選擇一方用inverse屬性維護關係,預設為false(維護),true(不維護)
//角色所屬的使用者的集合
Set<User> users = new HashSet<User>();
//使用者所屬的角色的集合
Set<Role> roles = new HashSet<Role>();
<!-- 多對多關係表達 <!-- name關聯的另一方集合屬性名稱 table中間表的名稱 cascade 級聯操作 inverse 維護關係 column當前物件在中間表中的外來鍵名字 class 關聯的另一方類的全路徑 column 關聯的另一方類在中間表的主鍵名 --> <set name="roles" table="sys_user_role" cascade="save-update" inverse="false"> <key column="user_id"></key> <many-to-many class="Role" column="role_id"></many-to-many> </set>
<!-- 多對多關係的表達 -->
<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>
建立使用者實體
package cn.zhicheng.domain; import java.util.HashSet; import java.util.Set; public class Role { private long role_id; private String role_name; private String role_memo; //角色所屬的使用者的集合 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; } }
建立角色實體
package cn.zhicheng.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; //使用者所屬的角色的集合 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.zhicheng.domain">
<!-- 建立資料庫表與類的對映 -->
<class name="User" table="sys_user">
<!-- 建立類中屬性與表中主鍵的對應 -->
<id name="user_id" column="user_id">
<!-- 配置主鍵生成策略 -->
<generator class="native"></generator>
</id>
<!-- 建立類中普通 屬性對應表的欄位的對應-->
<!-- property中還有 length type not-null unique 燈屬性-->
<property name="user_code" ></property>
<property name="user_name" ></property>
<property name="user_password" ></property>
<property name="user_state" ></property>
<!-- 多對多關係表達 -->
<set name="roles" table="sys_user_role" cascade="save-update" inverse="false">
<key column="user_id"></key>
<many-to-many class="Role" column="role_id"></many-to-many>
</set>
</class>
</hibernate-mapping>
建立角色對映
<?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.zhicheng.domain">
<!-- 建立資料庫表與類的對映 -->
<class name="Role" table="sys_role">
<!-- 建立類中屬性與表中主鍵的對應 -->
<id name="role_id" column="role_id">
<!-- 配置主鍵生成策略 -->
<generator class="native"></generator>
</id>
<!-- 建立類中普通 屬性對應表的欄位的對應-->
<!-- property中還有 length type not-null unique 燈屬性-->
<property name="role_name" ></property>
<property name="role_memo" ></property>
<!-- 多對多關係的表達 -->
<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>
</class>
</hibernate-mapping>
在核心配置中加入對映檔案
<mapping resource="cn/zhicheng/domain/Role.hbn.xml"/>
<mapping resource="cn/zhicheng/domain/User.hbn.xml"/>
編寫測試類
package cn.zhicheng.many2many;
import org.hibernate.Session;
import org.hibernate.Transaction;
import org.junit.Test;
import cn.itheima.domain.Customer;
import cn.itheima.domain.LinkMan;
import cn.itheima.domain.Role;
import cn.itheima.domain.User;
import cn.itheima.utils.HibernateUtils;
public class Many2many {
@Test
/*
* 多對多表格的操作
*/
public void test(){
//獲得session
Session session = HibernateUtils.openSession();
//開啟事務
Transaction tx = session.beginTransaction();
//執行操作
User u1 = new User();
u1.setUser_name("使用者1");
User u2 = new User();
u2.setUser_name("使用者2");
Role r1 = new Role();
r1.setRole_name("角色1");
Role r2 = new Role();
r2.setRole_name("角色2");
u1.getRoles().add(r1);
u1.getRoles().add(r2);
u2.getRoles().add(r1);
u2.getRoles().add(r2);
// r1.getUsers().add(u1);
// r2.getUsers().add(u2);
// session.save(r1);
// session.save(r2);
session.save(u1);
session.save(u2);
//提交事務
tx.commit();
//釋放資源
session.close();
}
@Test
/*
* 多對多表格的操作
* 刪除一個使用者1的一個角色1 使用者1的id為1l
*/
public void test2(){
//獲得session
Session session = HibernateUtils.openSession();
//開啟事務
Transaction tx = session.beginTransaction();
//執行操作
User u1 = session.get(User.class, 1l);
Role r1 = session.get(Role.class, 1l);
u1.getRoles().remove(r1);
//提交事務
tx.commit();
//釋放資源
session.close();
}
}