博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
多对多的映射关系和级联
阅读量:3907 次
发布时间:2019-05-23

本文共 5156 字,大约阅读时间需要 17 分钟。

开发步骤:

创建表

 用户表

CREATE TABLE sys_user (
user_id bigint(32) NOT NULL AUTO_INCREMENT COMMENT ‘用户id’,
user_code varchar(32) NOT NULL COMMENT ‘用户账号’,
user_name varchar(64) NOT NULL COMMENT ‘用户名称’,
user_password varchar(32) NOT NULL COMMENT ‘用户密码’,
user_state char(1) NOT NULL COMMENT ‘1:正常,0:暂停’,
PRIMARY KEY (user_id)
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8;
角色表
CREATE TABLE sys_role (
role_id bigint(32) NOT NULL AUTO_INCREMENT,
role_name varchar(32) NOT NULL COMMENT ‘角色名称’,
role_memo varchar(128) DEFAULT NULL COMMENT ‘备注’,
PRIMARY KEY (role_id)
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8;
中间表
CREATE TABLE sys_user_role (
role_id bigint(32) NOT NULL COMMENT ‘角色id’,
user_id bigint(32) NOT NULL COMMENT ‘用户id’,
PRIMARY KEY (role_id,user_id),
KEY FK_user_role_user_id (user_id),
CONSTRAINT FK_user_role_role_id FOREIGN KEY (role_id) REFERENCES sys_role (role_id) ON DELETE NO ACTION ON UPDATE NO ACTION,
CONSTRAINT FK_user_role_user_id FOREIGN KEY (user_id) REFERENCES sys_user (user_id) ON DELETE NO ACTION ON UPDATE NO ACTION
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

创建实体

用户的实体

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
roles = new HashSet
();

角色的实体

public class Role {
private Long role_id;
private String role_name;
private String role_memo;

private Set
users = new HashSet
();

1.3.1.3创建映射

用户的映射

《class name=“com.yidongxueyuan.mapping.User” table=“sys_user”> 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”/>

角色的映射

class name=“com.yidongxueyuan.mapping.Role” table=“sys_role”> id

name=“role_id” column=“role_id”> generator class=“native”/>
property name=“role_name” column=“role_name”/> property
name=“role_memo” column=“role_memo”/>

编写测试类

/*

  • 测试多对多:

    */
    public class HibernateManyToMany {

    @Test

    public void test01() {
    Session session = HibernateUtils.getCurrentSession();
    Transaction tx = session.beginTransaction();

    //创建一个2个用户:  User user1 = new User(); user1.setUser_name("毕老师");  User user2 = new User(); user2.setUser_name("张老师");   //创建三个角色:  Role role1= new Role(); role1.setRole_name("市场部");  Role role2= new Role(); role2.setRole_name("研发部");  Role role3= new Role(); role3.setRole_name("人资部");  //设置双向关联关系: user1.getRoles().add(role1);// 1 2 角色:  user1.getRoles().add(role2);// 1 2 角色:  user2.getRoles().add(role2);// 2 3 Juese user2.getRoles().add(role3);// 2 3 Juese  role1.getUsers().add(user1); role2.getUsers().add(user1); role2.getUsers().add(user2); role3.getUsers().add(user2);  //保存操作:  /*  * 问题:如果设置了双向维护: 两个表都有权利维护第三种表: 会出现主键冲突问题:  * org.hibernate.exception.ConstraintViolationException:   * could not execute statement  *   * 解决: 必须一方放弃外键的维护:   * 通常设置被动方放弃一方放弃维护外键。  被选择的一方: ;role  * 在role当中的配置文件当中: inverse="true"  */ session.save(user1); session.save(user2); session.save(role1); session.save(role2); session.save(role3);  tx.commit();

    }

    }

Hibernate的多对多的操作

只保存一边是否可以

/*
* 测试: 值保存一方是否可以?
* 经过测试: 不可以, 同样的会抛出一个异常。
* 一个持久对象关联了一个瞬时对象。
* 解决: 设置级联操作:
*/
@Test
public void test02() {
Session session = HibernateUtils.getCurrentSession();
Transaction tx = session.beginTransaction();

User user1 = new User();	user1.setUser_name("毕老师");		Role role1= new Role();	role1.setRole_name("市场部");		//设置双向关联关系:	user1.getRoles().add(role1);// 1 2 角色: 	role1.getUsers().add(user1);		session.save(user1);

// session.save(role1);

tx.commit();
}
1.3.2.2多对多的级联保存或更新
保存用户级联保存角色

保存角色级联保存用户

1.3.2.3多对多的级联删除(基本用不上)

删除用户级联删除角色

删除角色级联删除用户

1.3.2.4多对多的其他的操作

给用户选择角色

给用户改选角色

给用户删除角色

还是放一个多对多的例子吧233333333333333

package com.yidongxueyuan.test;import org.hibernate.Session;import org.hibernate.Transaction;import com.yidongxueyuan.mapping.Role;import com.yidongxueyuan.mapping.User;import com.yidongxueyuan.utils.HibernateUtils;public class HibernateManyToMany {	public static void main(String[] args) {		//保存操作: 		Session session = HibernateUtils.getCurrentSession();		Transaction tx = session.beginTransaction();				//准备数据:  用户数据: 		User user = new User(); 		user.setUser_name("bi1");				User user2 = new User(); 		user2.setUser_name("he2");				//准备角色数据: 		Role role1= new Role(); 		role1.setRole_name("普通用户");						Role role2= new Role(); 		role2.setRole_name("会员用户");				Role role3= new Role(); 		role3.setRole_name("管理员");				//建立双方之间的关系: 		user.getRoles().add(role1);		user.getRoles().add(role2);				user2.getRoles().add(role2);		user2.getRoles().add(role3);				role1.getUsers().add(user);		role2.getUsers().add(user);				role2.getUsers().add(user2);		role3.getUsers().add(user2);				//保存: 		session.save(user);		session.save(user2);				session.save(role1);		session.save(role2);		session.save(role3);				//运行结果: Duplicate entry '1-1' for key 'PRIMARY' 出现了异常: 		//原因: user 和 role 都维护了映射表: 		//解决: 是的一方放弃外键的维护全: 		/*		 * 被动方放弃外键维护: 		 */				tx.commit();			}}

转载地址:http://zwqen.baihongyu.com/

你可能感兴趣的文章
shell中trap捕获信号
查看>>
关于Linux Shell的信号trap功能你必须知道的细节
查看>>
Linux原始套接字实现分析
查看>>
CENTOS 6.5 配置YUM安装NGINX
查看>>
#ifdef DEBUG的理解
查看>>
Linux 任务控制的几个技巧( &, [ctrl]-z, jobs, fg, bg, kill)
查看>>
慧眼云:基于云计算和大数据分析的主动防御实践
查看>>
58集团监控业务实践:将网站运行信息透明化
查看>>
给Django用户的SQLAlchemy介绍
查看>>
consul http api
查看>>
如何定位问题
查看>>
使用火焰图分析CPU性能回退问题
查看>>
openresty lua zlib整合安装 让lua支持解压服务端压缩过的数据
查看>>
Nginx与Gzip请求
查看>>
最佳日志实践(v2.0)
查看>>
logstash日志分析的配置和使用
查看>>
Nginx问题定位之监控进程异常退出
查看>>
https://imququ.com/post/content-encoding-header-in-http.html
查看>>
字符编码的前世今生
查看>>
视频笔记:Go 抓包、分析、注入 - John Leon
查看>>