您的位置:首页 > 其它

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

2017-12-03 18:46 316 查看

前言

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

分析

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

技术分析之多对多的级联保存
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
4000
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补充

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


内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: