Hibernate多对多关联关系映射

核心代码

多表只选择一方用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();
	}
}

猜你喜欢

转载自blog.csdn.net/weixin_40007271/article/details/86090079