Hibernate学习笔记四-多对多的关系配置

1.创建数据库和表
比如用户表,角色表,中间表
一个用户可对应多种角色
一种角色可对应多个用户

2.创建实体
用户表

    public class User {
    	private Long user_id;
    	private String user_code;
    	private String user_name;
    	private String user_password;
    	private String 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 String getUser_state() {
    		return user_state;
    	}
    	public void setUser_state(String user_state) {
    		this.user_state = user_state;
    	}
    	public Set<Role> getRoles() {
    		return roles;
    	}
    	public void setRoles(Set<Role> roles) {
    		this.roles = roles;
    	}
    }
角色表
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;
	}
}

3.创建映射文件
User.hbm.xml

<?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>
	<class name="com.itheima.hibernate.demo2.User" table="sys_user">
		<!-- 建立OID与主键的映射 -->
		<id name="user_id" column="user_id">
			<generator class="native"/>
		</id>
		<!-- 建立普通属性与字段映射 -->
		<property name="user_code" column="user_code"/>
		<property name="user_name" column="user_name"/>
		<property name="user_password" column="user_password"/>
		<property name="user_state" column="user_state"/>
		
		<!-- 建立与角色的多对多的映射关系 -->
		<!-- 
			set标签
				* name		:对方的集合的属性名称。
				* table		:多对多的关系需要使用中间表,放的是中间表的名称。
		 -->
		<set name="roles" table="sys_user_role" cascade="save-update,delete"  >
			<!-- 
				key标签:
					* column	:当前的对象对应中间表的外键的名称。
			 -->
			<key column="user_id"/>
			<!-- 
				many-to-many标签:
					* class		:对方的类的全路径
					* column	:对方的对象在中间表中的外键的名称。
			 -->
			<many-to-many class="com.itheima.hibernate.demo2.Role" column="role_id"/>
		</set>
		
	</class>
</hibernate-mapping>

Role.hbm.xml

<?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>
	<class name="com.itheima.hibernate.demo2.Role" table="sys_role">
		<!-- 建立OID与主键的映射 -->
		<id name="role_id" column="role_id">
			<generator class="native"/>
		</id>
		<!-- 建立普通属性与字段的映射 -->
		<property name="role_name" column="role_name"/>
		<property name="role_memo" column="role_memo"/>
		
		<!-- 与用户的多对多的映射关系 -->
		<!-- 
			set标签
				* name		:对方的集合的属性名称。
				* table		:多对多的关系需要使用中间表,放的是中间表的名称。
		 -->
		<set name="users" table="sys_user_role" inverse="true">
			<!-- 
				key标签:
					* column	:当前的对象对应中间表的外键的名称。
			 -->
			<key column="role_id"/>
			<!-- 
				many-to-many标签:
					* class		:对方的类的全路径
					* column	:对方的对象在中间表中的外键的名称。
			 -->
			<many-to-many class="com.itheima.hibernate.demo2.User" column="user_id"/>
		</set>
	</class>
</hibernate-mapping>

4.测试类

public class HibernateDemo2 {
	@Test
	public void demo1() {
		Session session = HibernateUtils.getCurrentSession();
		Transaction transaction = session.beginTransaction();
		
		User user1 = new User();
		user1.setUser_name("shawchen1");
		User user2 = new User();
		user2.setUser_name("shawchen2");
		
		Role role1 = new Role();
		role1.setRole_name("111");
		Role role2 = new Role();
		role2.setRole_name("222");
		Role role3 = new Role();
		role3.setRole_name("333");
		
		user1.getRoles().add(role1);
		user1.getRoles().add(role2);
		user2.getRoles().add(role2);
		user2.getRoles().add(role3);
		role1.getUsers().add(user1);
		role2.getUsers().add(user1);
		role2.getUsers().add(user2);
		role3.getUsers().add(user2);

		// 保存操作:多对多建立了双向的关系必须有一方放弃外键维护。
		// 一般是被动方放弃外键维护权。
		session.save(user1);
		session.save(user2);
		session.save(role1);
		session.save(role2);
		session.save(role3);
		
		
		transaction.commit();
	}
	
	@Test
	/**
	 * 多对多的操作:
	 * * 只保存一边是否可以?不可以,瞬时对象异常
	 */
	public void demo2(){
		Session session = HibernateUtils.getCurrentSession();
		Transaction tx = session.beginTransaction();
		
		// 创建2个用户
		User user1 = new User();
		user1.setUser_name("shawchen1");
		
		// 创建3个角色
		Role role1 = new Role();
		role1.setRole_name("111");
		
		// 设置双向的关联关系:
		user1.getRoles().add(role1);
		role1.getUsers().add(user1);
		// 只保存用户:
		// session.save(user1);
		session.save(role1);
		
		tx.commit();
	}
	
	@Test
	/**
	 * 多对多的级联保存:
	 * * 保存用户级联保存角色。在用户的映射文件中配置。
	 * * 在User.hbm.xml中的set上配置 cascade="save-update"
	 */
	public void demo3(){
		Session session = HibernateUtils.getCurrentSession();
		Transaction tx = session.beginTransaction();
		
		// 创建2个用户
		User user1 = new User();
		user1.setUser_name("shawchen1");
		
		// 创建3个角色
		Role role1 = new Role();
		role1.setRole_name("111");
		
		// 设置双向的关联关系:
		user1.getRoles().add(role1);
		role1.getUsers().add(user1);
		// 只保存用户:
		session.save(user1);
		
		tx.commit();
	}
	
	
	/**
	 * 多对多的级联保存:
	 * * 保存角色级联保存用户。在角色的映射文件中配置。
	 * * 在Role.hbm.xml中的set上配置 cascade="save-update"
	 */
	@Test
	public void demo4(){
		Session session = HibernateUtils.getCurrentSession();
		Transaction tx = session.beginTransaction();
		
		// 创建2个用户
		User user1 = new User();
		user1.setUser_name("shawchen1");
		
		// 创建3个角色
		Role role1 = new Role();
		role1.setRole_name("111");
		
		// 设置双向的关联关系:
		user1.getRoles().add(role1);
		role1.getUsers().add(user1);
		// 只保存用户:
		session.save(role1);
		
		tx.commit();
	}
	
	/**
	 * 多对多的级联删除:
	 * * 删除用户级联删除角色
	 * * 在User.hbm.xml中的set上配置 cascade="delete"
	 */
	@Test
	public void demo5(){
		Session session = HibernateUtils.getCurrentSession();
		Transaction tx = session.beginTransaction();
		
		// 查询1号用户:
		User user  = session.get(User.class, 1l);
		session.delete(user);
		
		tx.commit();
	}
	
	/**
	 * 多对多的级联删除:
	 * * 删除角色级联删除用户
	 * * 在Role.hbm.xml中的set上配置 cascade="delete"
	 */
	@Test
	public void demo6(){
		Session session = HibernateUtils.getCurrentSession();
		Transaction tx = session.beginTransaction();
		
		// 查询2号角色:
		Role role  = session.get(Role.class, 2l);
		session.delete(role);
		
		tx.commit();
	}
	
	@Test
	public void demo7() {
		Session session = HibernateUtils.getCurrentSession();
		Transaction transaction = session.beginTransaction();
		
		// 给1号用户多选2号角色
		// 查询1号用户
		User user = session.get(User.class, 1l);
		// 查询2号角色
		Role role = session.get(Role.class, 2l);
		user.getRoles().add(role);
		
		transaction.commit();
	}
	
	@Test
	/**
	 * 给用户改选角色
	 */
	public void demo8(){
		Session session = HibernateUtils.getCurrentSession();
		Transaction tx = session.beginTransaction();
		
		// 给1号用户将原有的1号角色改为3号角色
		// 查询1号用户
		User user  = session.get(User.class, 1l);
		// 查询1号角色
		Role role2 = session.get(Role.class, 1l);
		Role role3 = session.get(Role.class, 3l);
		user.getRoles().remove(role2);
		user.getRoles().add(role3);
		tx.commit();
	}
	
	@Test
	/**
	 * 给用户改选角色
	 */
	public void demo9(){
		Session session = HibernateUtils.getCurrentSession();
		Transaction tx = session.beginTransaction();
		
		// 给2号用户删除1号角色
		// 查询2号用户
		User user = session.get(User.class, 2l);
		// 查询1号角色
		Role role = session.get(Role.class, 1l);
		user.getRoles().remove(role);
		tx.commit();
	}
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值