一、编写实体类配置关联关系:

1、多对多使用注解@ManyToMany配置:a、 在实体中添加一个集合属性  b、在属性上添加ManyToMany注解 

         c、@JoinTable 注解配置关联关系(name中间表名称),当前表和中间表的映射关系,对方表和中间表的映射关系

2、多对多关系中,只能一方维护关联关系、另一方放弃维护

3、级联操作: @ManyToMnay注解中   配置cascade属性

4、 从表:关联属性上所加注解

@ManyToMany(mappedBy = "roles")

主表:关联属性上所加注解

@ManyToMany(cascade = CascadeType.ALL)
    @JoinTable(name = "sys_user_role",joinColumns = @JoinColumn(
//            中间表和当前表映射字段的名字
            name="userid",
//            参照当前表的主键字段
            referencedColumnName = "user_id"),
            inverseJoinColumns =  @JoinColumn(
//            中间表和当前表映射字段的名字
                    name="roleid",
//            参照当前表的主键字段
                    referencedColumnName = "role_id")
    )

二、编写dao;主表从表dao都要继承JpaRepository

三、测试

package cn.zrf.jpa;

import cn.zrf.jpa.dao.SysRoleDao;
import cn.zrf.jpa.dao.SysUserDao;
import cn.zrf.jpa.entity.SysRole;
import cn.zrf.jpa.entity.SysUser;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.test.annotation.Commit;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
import org.springframework.transaction.annotation.Transactional; @RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration("classpath:applicationContext.xml")
public class ManyToMany {
@Autowired
SysUserDao sysUserDao;
@Autowired
SysRoleDao sysRoleDao; @Test
@Transactional
@Commit
public void addUserAndRole(){
//1、创建用户对象
SysUser user = new SysUser();
user.setUserName("admin");
user.setPassword("admin");
//2、创建角色对象
SysRole role = new SysRole();
role.setRoleName("管理员");
role.setMome("管理全部");
//3、配置用户和角色之间的关系
user.getRoles().add(role);
role.getUsers().add(user);
//4、把用户角色存入数据库
sysUserDao.save(user);
sysRoleDao.save(role);
}
@Test
@Transactional
@Commit
public void addUserAndRole1(){
//1、创建用户
SysUser sysUser = new SysUser();
sysUser.setUserName("张无忌");
sysUser.setPassword("admin");
SysUser sysUser1 = new SysUser();
sysUser1.setUserName("赵敏");
sysUser1.setPassword("admin");
//2、创建角色
SysRole sysRole = new SysRole();
sysRole.setRoleName("演员");
SysRole sysRole1 = new SysRole();
sysRole1.setRoleName("导演");
//3、配置用户和角色的关系
sysUser.getRoles().add(sysRole);
sysUser1.getRoles().add(sysRole);
sysUser.getRoles().add(sysRole1);
sysUser1.getRoles().add(sysRole1);
sysRole.getUsers().add(sysUser);
sysRole1.getUsers().add(sysUser);
sysRole.getUsers().add(sysUser1);
sysRole1.getUsers().add(sysUser1);
//4、存入数据库
sysUserDao.save(sysUser);
sysUserDao.save(sysUser1);
}
//删除
@Test
@Transactional
@Commit
public void del(){
sysUserDao.delete(3l);
}
}

  

SpringData表关系:多对多的更多相关文章

  1. 库增删该查,表增删该查,记录增删该查,表与表关系(多对多,多对一,一对一),mysql用户管理

    库增删该查 增加库 create database db1 create database db1 charset="gbk 查看库 show databases 查看所有库 show cr ...

  2. day 69 orm操作之表关系,多对多,多对一(wusir总结官网的API)

    对象  关系  模型 wusir博客地址orm官网API总结 django官网orm-API orm概要: ORM 跨表查询 class Book(models.Model): title = mod ...

  3. springData表关系:一对多

    一.编写实体类进行表关联 1.在一张表的关联属性上添加@OneToMany注解(关联属性用来记录多的一方的信息,是个集合,一般用set) 2.在另一个实体类的关联属性上添加@ManyToOne注解和  ...

  4. springData表关系:一对一

    一.编写两个实体类 1.一对一关系实现:a:使用外键关联 b:使用主键关联,两个表的主键相同 2.外键方案:配置关联关系:两个实体类互相关联,并且在关联的属性上添加一个@OneToOne代表一个对一个 ...

  5. mysql 表关系 与 修改表结构

    目录 mysql 表关系 与 修改表结构 两张表关系 分析步骤 修改表结构 mysql 表关系 与 修改表结构 两张表关系 多对一 以员工和部门举例 多个员工对应一个部门 foreign key 永远 ...

  6. Python之路第十三天,高级(7)-详述数据库一对多,多对多表关系的设计以及如何查询

    一对多表设计和查询方法 #!/usr/bin/env python3 # Author: Zhangxunan from sqlalchemy import create_engine from sq ...

  7. EF5+MVC4系列(1) Podwerdesigner15.1设计数据库;PD中间表和EF实体模型设计器生成中间表的区别;EF5.0 表关系插入数据(一对多,多对多)

    在上一篇文章中, http://www.cnblogs.com/joeylee/p/3790980.html  我们用 PD15.1 来设计了数据库,并且生成 了sql数据库,现在我们用 vs2013 ...

  8. 【mysql】如何通过navicat配置表与表的多对一关系,一对一关系?设计外键的效果

    背景: 现在要将接口自动化测试结果持久化,当前只是每次运行接口测试,将测试结果通过邮件发送给项目组成员.邮件内容如下: 表设计: 为了呈现这个结果:我设计了2张表run_result和run_deta ...

  9. 订单和产品的多对多表关系在crudapi系统零代码实现

    表关系管理 在上一篇序列号管理中,产品和销售订单都是孤立的单表,本文通过crudapi中表关系(relation)管理将多个表连接起来,形成一个整体. 概要 关系类型 表与表之间的关系(relatio ...

随机推荐

  1. 1. webpack 复制文件

    1. npm install --save-dev copy-webpack-plugin2. var CopyWebpackPlugin = require('copy-webpack-plugin ...

  2. Jmeter与LoadRunner的比较

    一.与Loadrunner的比较相似点 1.Jmeter的架构跟loadrunner原理一样, 都是通过中间代理,监控&收集并发客户端发现的指令,把他们生成脚本,再发送到应用服务器,再监控服务 ...

  3. PHP $_FILES的应用

    关于文件上传这块,如果处理不好的话,很容易成为黑客入侵的开口,例如黑客在你这个上传接口里放一段木马的文件,那只能祝你好运了. 所以,我们上传文件的时候都会先判断, 但是一般的操作是先上传,再判断,如果 ...

  4. urlencode()和rawurlencode()区别

    urlencode和rawurlencode两个方法在处理字母数字,特殊符号,中文的时候结果都是一样的 ,唯一的不同是对空格的处理,   urlencode处理成“+”,    rawurlencod ...

  5. Linux操作系统进入单用户模式的方法

    单用户模式的作用 在使用Linux的过程中,维护人员经常会碰到一些问题,就是在拥有root账号权限和密码的用户中,总是会出现忘记root密码的情况. 遇到这种情况,一般情况下,维护人员就会通过最常用的 ...

  6. Scala教程之:scala的参数

    文章目录 默认参数值 命名参数 scala的参数有两大特点: 默认参数值 命名参数 默认参数值 在Scala中,可以给参数提供默认值,这样在调用的时候可以忽略这些具有默认值的参数. def log(m ...

  7. CUBA:如何准备上线

            "在我电脑上是好的呢!"现在看来,这句话更像是调侃开发人员的一个段子,但是"开发环境与生产环境"之间的矛盾依然存在.作为开发者,你需要记住,你写 ...

  8. 在线教育项目-day05【课程分类管理-添加课程分类】

    1.引入依赖 之前测试EasyExcel已经引入过了 2.利用代码生成器生成结构 我们做的只需要更改代码生成器的数据库表即可 3.运行代码生成器 4.书写代码 1.controller @RestCo ...

  9. 图论--差分约束--POJ 1364 King

    Description Once, in one kingdom, there was a queen and that queen was expecting a baby. The queen p ...

  10. 理解卷积神经网络中的channel

    在一般的深度学习框架的 conv2d 中,如 tensorflow.mxnet,channel 都是必填的一个参数 在 tensorflow 中,对于输入样本中 channels 的含义,一般是RGB ...