HIbernate--多对多的级联操作(保存、更新、删除)详解

级联操作

多对多的级联操作同一对多和多对一是一样的。如果只保存单独的一方是不可以的,还是需要保存双方的。如果想保存一方就需要设置级联操作。同样需要设置主控方。

创建表

创建sys_user、sys_role、sys_user_role三张表:
在这里插入图片描述

创建实体

User:

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;
	}
}

Role:

//角色对象
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;
	}
	
}
级联保存或更新

保存用户级联角色:
保存的主控方是用户,需要在用户一端配置:

<!-- save-update 级联更新 -->
<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>

测试:

	@Test
	//保存用户以及角色
	public void fun1(){
		Session session = HibernateUtils.openSession();
		Transaction tx = session.beginTransaction();
		//-------------------------------------------------
		//创建User
		User u1 = new User();
		u1.setUser_name("小明");
			
		//创建两个 Role
		Role r1 = new Role();
		r1.setRole_name("保洁");
		Role r2 = new Role();
		r2.setRole_name("保安");
		
		//用户表达关系(因为是由用户维护多对多关系,所以只需要写这一边)
		u1.getRoles().add(r1);
		u1.getRoles().add(r2);
		
		//调用Save方法级联保存
		session.save(u1);
		//-------------------------------------------------
		tx.commit();
		session.close();
	}

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

保存角色级联用户:
保存的主控方是角色,就需要在角色一端配置:

<set name="users" table="sys_user_role" inverse="true" cascade="savv-update">
	<key column="role_id" ></key>
	<many-to-many class="User" column="user_id" ></many-to-many>
</set>

测试:

	@Test
	//保存角色级联用户
	public void fun1(){
		Session session = HibernateUtils.openSession();
		Transaction tx = session.beginTransaction();
		//---------------------------------------------
		//创建User
		User u1 = new User();
		u1.setUser_name("二狗子");
		
		//创建Role
		Role r1 = new Role();
		r1.setRole_name("社会闲散人员");
		
		u1.getRoles().add(r1);
		r1.getUsers().add(u1);
		
		//调用Save方法级联保存
		session.save(r1);
		//---------------------------------------------
		tx.commit();
		session.close();
	}

在这里插入图片描述在这里插入图片描述在这里插入图片描述

级联删除

删除用户级联删除角色:
主控方是用户,所以需要在用户一端配置:

<set name="roles" table="sys_user_role" cascade="delete" >
	<key column="user_id" ></key>
	<many-to-many class="Role" column="role_id" ></many-to-many>
</set>

测试:

	@Test
	//删除二狗子和关联的角色
	public void fun4(){
		Session session = HibernateUtils.openSession();
		Transaction tx = session.beginTransaction();
		//---------------------------------------------
		//获得用户,二狗子
		User user = session.get(User.class, 11l);
		//级联删除(二狗子与社会闲散人员一同删除)
		session.delete(user);
		//---------------------------------------------
		tx.commit();
		session.close();
	}

在这里插入图片描述在这里插入图片描述在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值