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补充
需要在其中一方设置,放弃主键维护。一对多的情况下,一设置放弃,多设置级联
相关文章推荐
- Hibernate的学习之路二十七(多对多操作级联)
- Hibernate的学习之路二十七(多对多操作级联)
- Hibernate的学习之路二十七(多对多操作级联)
- Hibernate的学习之路二十七(多对多操作级联)
- Hibernate的学习之路二十七(多对多操作级联)
- Hibernate的学习之路二十七(多对多操作级联)
- Hibernate的学习之路二十七(多对多操作级联)
- Hibernate的学习之路二十七(多对多操作级联)
- Hibernate的学习之路二十七(多对多操作级联)
- Hibernate的学习之路二十七(多对多操作级联)
- Hibernate的学习之路二十七(多对多操作级联)
- Hibernate的学习之路二十七(多对多操作级联)
- Hibernate的学习之路二十七(多对多操作级联)
- Hibernate的学习之路二十七(多对多操作级联)
- Hibernate的学习之路二十一(一对多的级联保存)
- Hibernate学习笔记:级联操作
- Hibernate的学习之路十三(操作一级缓存)
- Hibernate的学习之路十三(操作一级缓存)
- Hibernate学习之级联操作3——一对一关联关系
- Hibernate的学习之路二十一(一对多的级联保存)