Hibernate的学习之路二十七(多对多操作级联)

前言

前面有说了一对多的情况下,通过级联来操作数据库。现在是多对多的情况下,操作级联。

分析

首先是需要说明的是多对多的情况下,需要有一方去放弃维护外键,不然会报错。
因为一方去保存了数据,另一方也去保存数据,两边都是对这个关系表进行操作,而且操作最后的结果也是一样的,就会造成冲突。


技术分析之多对多的级联保存

1. 级联保存
    * <set cascade="save-update">

级联删除(在多对多中是很少使用的)

1. 级联删除


以下是JAVABean代码:
package com.itheima.domain;

import java.util.HashSet;
import java.util.Set;

/**
 * 系统用户
 * @author Administrator
 */
public class User {
	
	private Long uid;
	private String username;
	private String password;
	
	// 编写都是集合
	private Set<Role> roles = new HashSet<Role>();
	
	public Long getUid() {
		return uid;
	}
	public void setUid(Long uid) {
		this.uid = uid;
	}
	public String getUsername() {
		return username;
	}
	public void setUsername(String username) {
		this.username = username;
	}
	public String getPassword() {
		return password;
	}
	public void setPassword(String password) {
		this.password = password;
	}
	public Set<Role> getRoles() {
		return roles;
	}
	public void setRoles(Set<Role> roles) {
		this.roles = roles;
	}
	
}


package com.itheima.domain;

import java.util.HashSet;
import java.util.Set;

/**
 * 系统角色
 * @author Administrator
 */
public class Role {
	
	private Long rid;
	private String rname;
	
	private Set<User> users = new HashSet<User>();
	
	public Long getRid() {
		return rid;
	}
	public void setRid(Long rid) {
		this.rid = rid;
	}
	public String getRname() {
		return rname;
	}
	public void setRname(String rname) {
		this.rname = rname;
	}
	public Set<User> getUsers() {
		return users;
	}
	public void setUsers(Set<User> users) {
		this.users = users;
	}

}


以下是级联操作。以及对关系表的操作,因为有快照更新,所以只要对集合操作就可以:


package com.itheima.test;

import org.hibernate.Session;
import org.hibernate.Transaction;
import org.junit.Test;

import com.itheima.domain.Role;
import com.itheima.domain.User;
import com.itheima.utils.HibernateUtils;

/**
 * 多对多的测试
 * @author Administrator
 */
public class Demo2 {
	
	/**
	 * 现在:张三用户,有2个角色,经理和演员
	 * 让张三没有演员角色
	 */
	@Test
	public void run3(){
		Session session = HibernateUtils.getCurrentSession();
		Transaction tr = session.beginTransaction();
		// 查询张三用户
		User u1 = session.get(User.class, 1L);
		// 查询角色
		Role r2 = session.get(Role.class, 2L);
		u1.getRoles().remove(r2);
		tr.commit();
	}
	
	/**
	 * 级联保存
	 */
	@Test
	public void run2(){
		Session session = HibernateUtils.getCurrentSession();
		Transaction tr = session.beginTransaction();
		// 模拟多对多,双向的关联
		User u1 = new User();
		u1.setUsername("张三");
		User u2 = new User();
		u2.setUsername("赵四");
		
		// 创建角色
		Role r1 = new Role();
		r1.setRname("经理");
		Role r2 = new Role();
		r2.setRname("演员");
		
		u1.getRoles().add(r1);
		u1.getRoles().add(r2);
		u2.getRoles().add(r1);
		
		// 保存数据
		session.save(u1);
		session.save(u2);
		
		tr.commit();
	}
	
	@Test
	public void run1(){
		Session session = HibernateUtils.getCurrentSession();
		Transaction tr = session.beginTransaction();
		// 模拟多对多,双向的关联
		User u1 = new User();
		u1.setUsername("张三");
		User u2 = new User();
		u2.setUsername("赵四");
		
		// 创建角色
		Role r1 = new Role();
		r1.setRname("经理");
		Role r2 = new Role();
		r2.setRname("演员");
		
		// 关联
		u1.getRoles().add(r1);
		u1.getRoles().add(r2);
		r1.getUsers().add(u1);
		r2.getUsers().add(u1);
		
		u2.getRoles().add(r1);
		r1.getUsers().add(u2);
		
		session.save(u1);
		session.save(u2);
		session.save(r1);
		session.save(r2);
		
		tr.commit();
	}

}

2017.12.04补充

需要在其中一方设置,放弃主键维护。
一对多的情况下,一设置放弃,多设置级联



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值