1. 多对多的关联关系

1.1. 权限和用户是多对多的关联关系

权限类(对应表名: t_auth): 多方

角色类(对应表名: t_role): 多方

权限角色类(对应表名: t_auth_role): 中间表

1.2. 权限表

1.3. 角色表

1.4. 权限角色表

2. 多对多的关联关系例子

2.1. 创建一个名为spring-data-jpa-many2many的Java项目, 同时添加相关jar包, 并添加JUnit能力。

2.2. 新建Role.java

package com.bjbs.pojo;import java.io.Serializable;
import java.util.HashSet;
import java.util.Set;
import javax.persistence.CascadeType;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.FetchType;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.JoinTable;
import javax.persistence.ManyToMany;
import javax.persistence.Table;@Entity // 指定该类是实体类
@Table(name = "t_role") // 指定数据库表名(表名和实体类对应)
public class Role implements Serializable {private static final long serialVersionUID = 1L;@Id // 指定为主键@GeneratedValue(strategy = GenerationType.IDENTITY) // 指定主键生成策略@Column(name = "id") // 指定表中列名(列名和属性名对应)private Integer id;@Column(name = "name")private String name; // 角色名// fetch=FetchType.EAGER立即加载@ManyToMany(cascade=CascadeType.PERSIST, fetch=FetchType.EAGER)// @JoinTable: 配置中间表信息// joinColumns: 建立当前表在中间表中的外键字段@JoinTable(name="t_auth_role", joinColumns=@JoinColumn(name="r_id"), inverseJoinColumns=@JoinColumn(name="a_id"))private Set<Auth> auths = new HashSet<Auth>();public Integer getId() {return id;}public void setId(Integer id) {this.id = id;}public String getName() {return name;}public void setName(String name) {this.name = name;}public Set<Auth> getAuths() {return auths;}public void setAuths(Set<Auth> auths) {this.auths = auths;}@Overridepublic String toString() {return "Role [id=" + id + ", name=" + name + "]";}}

2.3. 新建Auth.java

package com.bjbs.pojo;import java.io.Serializable;
import java.util.HashSet;
import java.util.Set;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.ManyToMany;
import javax.persistence.Table;@Entity // 指定该类是实体类
@Table(name = "t_auth") // 指定数据库表名(表名和实体类对应)
public class Auth implements Serializable {private static final long serialVersionUID = 1L;@Id // 指定为主键@GeneratedValue(strategy = GenerationType.IDENTITY) // 指定主键生成策略@Column(name = "id") // 指定表中列名(列名和属性名对应)private Integer id;@Column(name = "name")private String name; // 权限名@ManyToMany(mappedBy="auths")private Set<Role> roles = new HashSet<Role>();public Integer getId() {return id;}public void setId(Integer id) {this.id = id;}public String getName() {return name;}public void setName(String name) {this.name = name;}public Set<Role> getRoles() {return roles;}public void setRoles(Set<Role> roles) {this.roles = roles;}@Overridepublic String toString() {return "Auth [id=" + id + ", name=" + name + "]";}}

2.4. 新建RoleRepository.java

package com.bjbs.dao;import org.springframework.data.jpa.repository.JpaRepository;
import com.bjbs.pojo.Role;/*** 参数一T: 当前需要映射的实体; 参数二 T: 当前映射的实体中的id的类型*/
public interface RoleRepository extends JpaRepository<Role, Integer> {}

2.5. 新建TestRoleRepository.java

package com.bjbs.test;import java.util.Set;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
import com.bjbs.dao.RoleRepository;
import com.bjbs.pojo.Role;
import com.bjbs.pojo.Auth;@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration("classpath:applicationContext.xml")
public class TestRoleRepository {@Autowiredprivate RoleRepository roleRepository;@Testpublic void findOne() {Role role = roleRepository.findOne(1);System.out.println(role);Set<Auth> auths = role.getAuths();for (Auth auth : auths) {System.out.println(auth);}}@Testpublic void save() {// 创建角色Role role = new Role();role.setName("张三");// 创建权限Auth auth = new Auth();auth.setName("注册用户");// 建立关系role.getAuths().add(auth);auth.getRoles().add(role);// 保存数据roleRepository.save(role);}
}

2.6. 在src下新建application.properties

spring.datasource.driverClassName=com.mysql.cj.jdbc.Driver
spring.datasource.url=jdbc:mysql://192.168.25.138:3306/StudyMybatis?useSSL=true&useUnicode=true&characterEncoding=utf-8&serverTimezone=Asia/Shanghai
spring.datasource.username=root
spring.datasource.password=lyw123456

2.7. 在src下新建applicationContext.xml

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xmlns="http://www.springframework.org/schema/beans"xmlns:context="http://www.springframework.org/schema/context"xmlns:tx="http://www.springframework.org/schema/tx"xmlns:jpa="http://www.springframework.org/schema/data/jpa"xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsdhttp://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsdhttp://www.springframework.org/schema/data/jpa http://www.springframework.org/schema/data/jpa/spring-jpa.xsdhttp://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx.xsd"><!-- 配置读取properties文件的工具类 --><context:property-placeholder location="classpath:application.properties" /><!-- 配置c3p0数据库连接池 --><bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource"><property name="jdbcUrl" value="${spring.datasource.url}" /><property name="driverClass" value="${spring.datasource.driverClassName}" /><property name="user" value="${spring.datasource.username}" /><property name="password" value="${spring.datasource.password}" /></bean><!-- Spring整合JPA 配置EntityManagerFactory --><bean id="entityManagerFactory" class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean"><property name="dataSource" ref="dataSource" /><property name="jpaVendorAdapter"><bean class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter"><!-- hibernate相关的属性的注入 --><!-- 配置数据库类型 --><property name="database" value="MYSQL" /><!-- 正向工程 自动创建表 --><!-- <property name="generateDdl" value="true" /> --><!-- 显示执行的SQL --><property name="showSql" value="true" /></bean></property><!-- 扫描实体的包 --><property name="packagesToScan"><list><value>com.bjbs.pojo</value></list></property></bean><!-- 配置Hibernate的事务管理器 --><bean id="transactionManager" class="org.springframework.orm.jpa.JpaTransactionManager"><property name="entityManagerFactory" ref="entityManagerFactory" /></bean><!-- 配置开启注解事务处理 --><tx:annotation-driven transaction-manager="transactionManager" /><!-- 配置springIOC的注解扫描 --><context:component-scan base-package="com.bjbs.service" /><!-- Spring Data JPA 的配置 --><!-- base-package: 扫描dao接口所在的包 --><jpa:repositories base-package="com.bjbs.dao" />
</beans>

2.8. 查询角色

2.9. 保存角色

011_Spring Data JPA多对多关系相关推荐

  1. spring data jpa 多对多查询

    spring data jpa 多对多查询 以用户-角色 多读多为例: User类,用户 @Entity public class User {private String username;priv ...

  2. 010_Spring Data JPA一对多关系

    1. 一对多的关联关系 1.1. 角色和用户是一对多的关联关系 角色类(对应表名: t_role): 一方 用户类(对应表名: t_user): 多方 1.2. 角色表 1.3. 用户表 2. 一对多 ...

  3. Spring Data JPA是什么?以及简单的使用(联表查询)

    Spring Data学习网站(下载gitHub工程学习) Spring Boot JPA 使用教程 - fishpro - 博客园 Spring Data JPA是什么?以及相关概述 首先Sprin ...

  4. 【Spring Data JPA自学笔记五】一对多、多对多和级联

    文章目录 数据库表的关系 一对多 多对多 Spring Data JPA实现一对多 基本配置 实现一对多 放弃维护权 Spring Data JPA实现多对多 基本配置 实现多对多 级联 之前的所有操 ...

  5. Spring Data JPA教程:获取所需的依赖关系

    在创建使用Spring Data JPA的应用程序之前,我们需要获取所需的依赖关系. 这篇博客文章标识了必需的组件,并描述了如何使用Maven获得它们. 让我们开始吧. 其他阅读:如果您不熟悉Spri ...

  6. Spring Boot 入门系列(二十八) JPA 的实体映射关系,一对一,一对多,多对多关系映射!...

    前面讲了Spring Boot 使用 JPA,实现JPA 的增.删.改.查的功能,同时也介绍了JPA的一些查询,自定义SQL查询等使用.JPA使用非常简单,功能非常强大的ORM框架,无需任何数据访问层 ...

  7. 009_Spring Data JPA一对一关系

    1. 一对一的关联关系 1.1. 人和身份证是一对一的关联关系 人类(对应表名: t_people): 一方 身份证类(对应表名: t_icard): 一方 1.2. 身份证表 1.3. 人类表 2. ...

  8. jpa双向多对多关系

    多对多关系相比其他其中关联关系,显得稍微复杂了一点点,这个复杂度主要体现在对这种关联关系的理解上.和其他关联关系不同的是这种关联多出来了一张中间表,操作上多了些许复杂,来随便看下吧 1  实体的定义 ...

  9. spring data jpa 详解

    2019独角兽企业重金招聘Python工程师标准>>> 本篇进行Spring-data-jpa的介绍,几乎涵盖该框架的所有方面,在日常的开发当中,基本上能满足所有需求.这里不讲解JP ...

最新文章

  1. 修改服务器端的访问模式,ftp服务器端 修改主动模式
  2. loadrunner中创建唯一随机数
  3. 软考-信息系统项目管理师-知识管理
  4. Spring--IoC(1)
  5. 中油即时通信电脑版_市场营销之即时通讯营销
  6. C/C++传递二维数组[转载]
  7. String 和 StringBuffrer 的区别
  8. AcWing 1762. 牛的洗牌(暴力)
  9. 类的加载过程详解之过程一:Loading(加载)阶段
  10. Oracle索引的建立及优缺点
  11. .xmind用什么软件打开_swf文件用什么打开 怎么把swf转换成mp4
  12. 易语言皮肤模块200个_王者荣耀:第一个200战令玩家,连天美都赞他的升级方法最科学...
  13. 计算机网络校园网建设设计摘要,计算机网络专业毕业论文校园网建设设计.doc...
  14. 新代系统9服务器警报,新代系统数控铣加工中心。新代系统龙门加工中心故障与报警...
  15. 手机NFC天线的集总参数设计
  16. 淘宝在线客服为什么回复那么慢
  17. 2022 最新Robots.txt文件教程
  18. 云端编译android,Android原生插件开发云端打包问题
  19. java 上传csv/xslx文件,预览,导入到数据库中
  20. Android之vold进程启动源码分析

热门文章

  1. bootstrap 栅栏系统
  2. heidiSQL使用简介
  3. Linux安装压缩版的mysql
  4. ScrollViewer滚动究竟来触发载入数据的Behavior
  5. [摘录]第一部分 掌舵领航(3)
  6. server2012 r2搭建双DNS
  7. oracle排序后的第一条记录
  8. Android开发者指南(12) —— Android Supported Media Formats
  9. [导入]rep_daqjcrb
  10. 基于docker搭建svn-server