环境搭建

源码地址:gitee:https://gitee.com/ytfs-dtx/JPA

导入依赖

  1. <properties>
  2. <spring.version>5.2.5.RELEASE</spring.version>
  3. <hibernate.version>5.4.10.Final</hibernate.version>
  4. <slf4j.version>1.7.30</slf4j.version>
  5. <log4j.version>2.12.1</log4j.version>
  6. <druid.version>1.1.21</druid.version>
  7. <mysql.version>5.1.6</mysql.version>
  8.  
  9. </properties>
  10.  
  11. <dependencies>
  12. <!-- spring beg -->
  13. <dependency>
  14. <groupId>org.springframework</groupId>
  15. <artifactId>spring-aop</artifactId>
  16. <version>${spring.version}</version>
  17. </dependency>
  18.  
  19. <dependency>
  20. <groupId>org.aspectj</groupId>
  21. <artifactId>aspectjweaver</artifactId>
  22. <version>1.9.5</version>
  23. </dependency>
  24. <dependency>
  25. <groupId>org.springframework</groupId>
  26. <artifactId>spring-context</artifactId>
  27. <version>${spring.version}</version>
  28. </dependency>
  29.  
  30. <dependency>
  31. <groupId>org.springframework</groupId>
  32. <artifactId>spring-context-support</artifactId>
  33. <version>${spring.version}</version>
  34. </dependency>
  35. <dependency>
  36. <groupId>org.springframework</groupId>
  37. <artifactId>spring-test</artifactId>
  38. <version>${spring.version}</version>
  39. </dependency>
  40.  
  41. <!-- spring对orm框架的支持包-->
  42. <dependency>
  43. <groupId>org.springframework</groupId>
  44. <artifactId>spring-orm</artifactId>
  45. <version>${spring.version}</version>
  46. </dependency>
  47. <dependency>
  48. <groupId>org.springframework</groupId>
  49. <artifactId>spring-beans</artifactId>
  50. <version>${spring.version}</version>
  51. </dependency>
  52. <dependency>
  53. <groupId>org.springframework</groupId>
  54. <artifactId>spring-core</artifactId>
  55. <version>${spring.version}</version>
  56. </dependency>
  57.  
  58. <!-- hibernate beg -->
  59. <dependency>
  60. <groupId>org.hibernate</groupId>
  61. <artifactId>hibernate-entitymanager</artifactId>
  62. <version>${hibernate.version}</version>
  63. </dependency>
  64. <dependency>
  65. <groupId>org.hibernate</groupId>
  66. <artifactId>hibernate-core</artifactId>
  67. <version>${hibernate.version}</version>
  68. </dependency>
  69. <dependency>
  70. <groupId>org.hibernate.validator</groupId>
  71. <artifactId>hibernate-validator</artifactId>
  72. <version>6.1.2.Final</version>
  73. <exclusions>
  74. <exclusion>
  75. <artifactId>classmate</artifactId>
  76. <groupId>com.fasterxml</groupId>
  77. </exclusion>
  78. </exclusions>
  79. </dependency>
  80.  
  81. <!-- hibernate end -->
  82. <dependency>
  83. <groupId>mysql</groupId>
  84. <artifactId>mysql-connector-java</artifactId>
  85. <version>${mysql.version}</version>
  86. </dependency>
  87. <dependency>
  88. <groupId>com.alibaba</groupId>
  89. <artifactId>druid</artifactId>
  90. <version>${druid.version}</version>
  91. </dependency>
  92. <!-- spring data jpa 的坐标 -->
  93. <dependency>
  94. <groupId>org.springframework.data</groupId>
  95. <artifactId>spring-data-jpa</artifactId>
  96. <version>2.2.6.RELEASE</version>
  97. <exclusions>
  98. <exclusion>
  99. <artifactId>slf4j-api</artifactId>
  100. <groupId>org.slf4j</groupId>
  101. </exclusion>
  102. </exclusions>
  103. </dependency>
  104.  
  105. <!-- el beg 使用spring data jpa 必须引入 -->
  106. <dependency>
  107. <groupId>javax.el</groupId>
  108. <artifactId>javax.el-api</artifactId>
  109. <version>3.0.0</version>
  110. </dependency>
  111. <dependency>
  112. <groupId>org.glassfish</groupId>
  113. <artifactId>javax.el</artifactId>
  114. <version>3.0.0</version>
  115. </dependency>
  116. <dependency>
  117. <groupId>org.slf4j</groupId>
  118. <artifactId>slf4j-api</artifactId>
  119. <version>${slf4j.version}</version>
  120. </dependency>
  121. <dependency>
  122. <groupId>org.apache.logging.log4j</groupId>
  123. <artifactId>log4j-api</artifactId>
  124. <version>${log4j.version}</version>
  125. </dependency>
  126. <dependency>
  127. <groupId>junit</groupId>
  128. <artifactId>junit</artifactId>
  129. <version>4.12</version>
  130. </dependency>
  131.  
  132. </dependencies>

创建配置文件

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <beans xmlns="http://www.springframework.org/schema/beans"
  3. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:aop="http://www.springframework.org/schema/aop"
  4. xmlns:context="http://www.springframework.org/schema/context"
  5. xmlns:jdbc="http://www.springframework.org/schema/jdbc" xmlns:tx="http://www.springframework.org/schema/tx"
  6. xmlns:jpa="http://www.springframework.org/schema/data/jpa"
  7. xmlns:task="http://www.springframework.org/schema/task"
  8. xsi:schemaLocation="
  9. http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
  10. http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop.xsd
  11. http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd
  12. http://www.springframework.org/schema/jdbc http://www.springframework.org/schema/jdbc/spring-jdbc.xsd
  13. http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx.xsd
  14. http://www.springframework.org/schema/data/jpa
  15. http://www.springframework.org/schema/data/jpa/spring-jpa.xsd">
  16. <!-- 配置实体类管理工厂 -->
  17. <bean id="entityManagerFactoryBean" class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean">
  18. <property name="dataSource" ref="dataSource"/>
  19.  
  20. <!-- 配置实体类的扫描 -->
  21. <property name="packagesToScan" value="xyz.ytfs.entity"/>
  22.  
  23. <!-- 配置jpa的提供方 -->
  24. <property name="persistenceProvider">
  25. <bean class="org.hibernate.jpa.HibernatePersistenceProvider"/>
  26. </property>
  27.  
  28. <!-- 配置提供方的适配器 -->
  29. <property name="jpaVendorAdapter">
  30. <bean class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter">
  31.  
  32. <!-- 数据库的类型 -->
  33. <property name="database" value="MYSQL"/>
  34.  
  35. <!-- 不自动创表 -->
  36. <property name="generateDdl" value="false"/>
  37.  
  38. <!-- 控制台打印sql语句 -->
  39. <property name="showSql" value="true"/>
  40.  
  41. <property name="databasePlatform" value="org.hibernate.dialect.MySQL55Dialect"/>
  42. </bean>
  43. </property>
  44.  
  45. <!-- jpa的方言:高级特性 -->
  46. <property name="jpaDialect">
  47. <bean class="org.springframework.orm.jpa.vendor.HibernateJpaDialect"/>
  48. </property>
  49.  
  50. <property name="jpaProperties">
  51. <props>
  52. <prop key="hibernate.hbm2ddl.auto">update</prop>
  53. </props>
  54. </property>
  55.  
  56. </bean>
  57.  
  58. <!-- 配置JPA的事务管理器 -->
  59.  
  60. <bean id="transactionManager" class="org.springframework.orm.jpa.JpaTransactionManager">
  61. <property name="entityManagerFactory" ref="entityManagerFactoryBean"/>
  62. </bean>
  63.  
  64. <!-- JPA -->
  65. <jpa:repositories base-package="xyz.ytfs.dao" transaction-manager-ref="transactionManager"
  66. entity-manager-factory-ref="entityManagerFactoryBean"/>
  67.  
  68. <!-- 配置数据源 -->
  69. <context:property-placeholder location="classpath:jdbcConfig.properties"/>
  70. <bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource">
  71. <property name="driverClassName" value="${jdbc.driver}"/>
  72. <property name="url" value="${jdbc.url}"/>
  73. <property name="username" value="${jdbc.username}"/>
  74. <property name="password" value="${jdbc.password}"/>
  75. </bean>
  76.  
  77. </beans>

创建实体类

注解说明

  1. @ManyToMany
  2. 作用:用于映射多对多关系
  3. 属性:
  4. cascade:配置级联操作。
  5. fetch:配置是否采用延迟加载。
  6. targetEntity:配置目标的实体类。映射多对多的时候不用写。
  7.  
  8. @JoinTable
  9. 作用:针对中间表的配置
  10. 属性:
  11. nam:配置中间表的名称
  12. joinColumns:中间表的外键字段关联当前实体类所对应表的主键字段
  13. inverseJoinColumn:中间表的外键字段关联对方表的主键字段
  14.  
  15. @JoinColumn
  16. 作用:用于定义主键字段和外键字段的对应关系。
  17. 属性:
  18. name:指定外键字段的名称
  19. referencedColumnName:指定引用主表的主键字段名称
  20. unique:是否唯一。默认值不唯一
  21. nullable:是否允许为空。默认值允许。
  22. insertable:是否允许插入。默认值允许。
  23. updatable:是否允许更新。默认值允许。
  24. columnDefinition:列的定义信息。

User

  1. package xyz.ytfs.entity;
  2.  
  3. import javax.persistence.*;
  4. import java.util.HashSet;
  5. import java.util.Set;
  6.  
  7. /**
  8. * @author by ytfs
  9. * @Classname User
  10. * @Description TODO(用户类)
  11. * @Date 2020/5/9 23:47
  12. */
  13.  
  14. @Entity
  15. @Table(name = "sys_user")
  16.  
  17. public class User {
  18.  
  19. @Id
  20. @GeneratedValue(strategy = GenerationType.IDENTITY)
  21. @Column(name = "user_id")
  22. private Long userId;
  23.  
  24. @Column(name = "user_name")
  25. private String userName;
  26.  
  27. /**
  28. * 配置用户到角色的多对多关系
  29. * 配置多对多的映射关系
  30. * 1.声明表关系的配置
  31. *
  32. * @ManyToMany(targetEntity = Role.class) //多对多
  33. * targetEntity:代表对方的实体类字节码
  34. * 2.配置中间表(包含两个外键)
  35. * @JoinTable name : 中间表的名称
  36. * joinColumns:配置当前对象在中间表的外键
  37. * @JoinColumn的数组 name:外键名
  38. * referencedColumnName:参照的主表的主键名
  39. * inverseJoinColumns:配置对方对象在中间表的外键
  40. */
  41.  
  42. @ManyToMany(targetEntity = Role.class, cascade = CascadeType.ALL)
  43. @JoinTable(name = "sys_user_role",
  44. //joinColumns,当前对象在中间表中的外键
  45. joinColumns = {@JoinColumn(name = "sys_user_id", referencedColumnName = "user_id")},
  46. //inverseJoinColumns,对方对象在中间表的外键
  47. inverseJoinColumns = {@JoinColumn(name = "sys_role_id", referencedColumnName = "role_id")})
  48. private Set<Role> roles = new HashSet<>();
  49.  
  50. public Long getUserId() {
  51. return userId;
  52. }
  53.  
  54. public void setUserId(Long userId) {
  55. this.userId = userId;
  56. }
  57.  
  58. public String getUserName() {
  59. return userName;
  60. }
  61.  
  62. public void setUserName(String userName) {
  63. this.userName = userName;
  64. }
  65.  
  66. public Set<Role> getRoles() {
  67. return roles;
  68. }
  69.  
  70. public void setRoles(Set<Role> roles) {
  71. this.roles = roles;
  72. }
  73.  
  74. @Override
  75. public String toString() {
  76. return "User{" +
  77. "userId=" + userId +
  78. ", userName='" + userName + '\'' +
  79. ", roles=" + roles +
  80. '}';
  81. }
  82. }

Role

  1. package xyz.ytfs.entity;
  2.  
  3. import javax.persistence.*;
  4. import java.util.HashSet;
  5. import java.util.Set;
  6.  
  7. /**
  8. * @author by ytfs
  9. * @Classname Role
  10. * @Description TODO(用户对应的类型)
  11. * @Date 2020/5/9 23:47
  12. */
  13.  
  14. @Entity
  15. @Table(name = "sys_role")
  16. public class Role {
  17.  
  18. @Id
  19. @GeneratedValue(strategy = GenerationType.IDENTITY)
  20. @Column(name = "role_id")
  21. private Long roleId;
  22.  
  23. @Column(name = "role_name")
  24. private String roleName;
  25.  
  26. /**
  27. * 配置用户到角色的多对多关系
  28. * 配置多对多的映射关系
  29. * 1.声明表关系的配置
  30. * @ManyToMany(targetEntity = User.class) //多对多
  31. * targetEntity:代表对方的实体类字节码
  32. * 2.配置中间表(包含两个外键)
  33. * @JoinTable
  34. * name : 中间表的名称
  35. * joinColumns:配置当前对象在中间表的外键
  36. * @JoinColumn的数组
  37. * name:外键名
  38. * referencedColumnName:参照的主表的主键名
  39. * inverseJoinColumns:配置对方对象在中间表的外键
  40. */
  41. /* @ManyToMany(targetEntity = User.class)
  42. @JoinTable(name = "sys_user_role",
  43. //joinColumns,当前对象在中间表中的外键
  44. joinColumns = {@JoinColumn(name = "sys_role_id", referencedColumnName = "role_id")},
  45. //inverseJoinColumns,对方对象在中间表的外键
  46. inverseJoinColumns = {@JoinColumn(name = "sys_user_id", referencedColumnName = "user_id")})*/
  47. @ManyToMany(mappedBy = "roles")
  48. private Set<User> users = new HashSet<>();
  49.  
  50. public Set<User> getUsers() {
  51. return users;
  52. }
  53.  
  54. public void setUsers(Set<User> users) {
  55. this.users = users;
  56. }
  57.  
  58. public Long getRoleId() {
  59. return roleId;
  60. }
  61.  
  62. public void setRoleId(Long roleId) {
  63. this.roleId = roleId;
  64. }
  65.  
  66. public String getRoleName() {
  67. return roleName;
  68. }
  69.  
  70. public void setRoleName(String roleName) {
  71. this.roleName = roleName;
  72. }
  73.  
  74. @Override
  75. public String toString() {
  76. return "Role{" +
  77. "roleId=" + roleId +
  78. ", roleName='" + roleName + '\'' +
  79. ", users=" + users +
  80. '}';
  81. }
  82. }

创建数据访问层的接口

IUserDao

  1. package xyz.ytfs.dao;
  2.  
  3. import org.springframework.data.jpa.repository.JpaRepository;
  4. import org.springframework.data.jpa.repository.JpaSpecificationExecutor;
  5. import xyz.ytfs.entity.User;
  6.  
  7. /**
  8. * @author by ytfs
  9. * @Classname UserDao
  10. * @Description TODO(用户的数据访问层接口)
  11. * @Date 2020/5/10 0:05
  12. */
  13.  
  14. public interface IUserDao extends JpaRepository<User, Long>, JpaSpecificationExecutor<User> {
  15. }

IRoleDao

  1. package xyz.ytfs.dao;
  2.  
  3. import org.springframework.data.jpa.repository.JpaRepository;
  4. import org.springframework.data.jpa.repository.JpaSpecificationExecutor;
  5. import xyz.ytfs.entity.Role;
  6.  
  7. /**
  8. * @author by ytfs
  9. * @Classname IRoleDao
  10. * @Description TODO(用户对应的职位数据访问层)
  11. * @Date 2020/5/10 0:07
  12. */
  13.  
  14. public interface IRoleDao extends JpaRepository<Role, Long>, JpaSpecificationExecutor<Role> {
  15. }

测试类

  1. package xyz.ytfs.test;
  2.  
  3. import org.junit.Test;
  4. import org.junit.runner.RunWith;
  5. import org.springframework.beans.factory.annotation.Autowired;
  6. import org.springframework.test.annotation.Rollback;
  7. import org.springframework.test.context.ContextConfiguration;
  8. import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
  9. import xyz.ytfs.dao.IRoleDao;
  10. import xyz.ytfs.dao.IUserDao;
  11. import xyz.ytfs.entity.Role;
  12. import xyz.ytfs.entity.User;
  13.  
  14. import javax.transaction.Transactional;
  15. import java.util.HashSet;
  16.  
  17. /**
  18. * @author by ytfs
  19. * @Classname JpaManyToManyTest
  20. * @Description TODO(多对多的测试类)
  21. * @Date 2020/5/10 0:08
  22. */
  23.  
  24. @RunWith(SpringJUnit4ClassRunner.class)
  25. @ContextConfiguration(locations = "classpath:applicationContext.xml")
  26. public class JpaManyToManyTest {
  27.  
  28. @Autowired
  29. private IRoleDao roleDao;
  30.  
  31. @Autowired
  32. private IUserDao userDao;
  33.  
  34. /**
  35. * 保存一个用户,保存一个角色
  36. * <p>
  37. * 多对多放弃维护权:被动的一方(这里就是被选择的一方Role)放弃
  38. */
  39. @Test
  40. @Transactional
  41. @Rollback(false)
  42. public void testSave() {
  43.  
  44. User user = new User();
  45. user.setUserName("雨听风说");
  46.  
  47. Role role = new Role();
  48. role.setRoleName("程序猿");
  49.  
  50. /*
  51. 表达多对多的关系,双方都表达的时候必须有一方放弃维护中间表,不然会抛出异常
  52. */
  53. role.getUsers().add(user);
  54.  
  55. user.getRoles().add(role);
  56.  
  57. this.userDao.save(user);
  58. this.roleDao.save(role);
  59.  
  60. }
  61.  
  62. //测试级联添加(保存一个用户的同时保存用户的关联角色)
  63. @Test
  64. @Transactional
  65. @Rollback(false)
  66. public void testCasacdeSave() {
  67. User user = new User();
  68. user.setUserName("雨听风说");
  69.  
  70. Role role = new Role();
  71. role.setRoleName("程序猿");
  72.  
  73. /*
  74. 表达多对多的关系
  75. */
  76. role.getUsers().add(user);
  77.  
  78. user.getRoles().add(role);
  79.  
  80. //级联操作,在保存用户的同时保存用户的类型
  81. this.userDao.save(user);
  82.  
  83. }
  84.  
  85. /**
  86. * 级联删除,删除id为1的客户
  87. */
  88.  
  89. @Test
  90. @Transactional
  91. @Rollback(false)
  92. public void testDeleteCasaced() {
  93. //查询id为1的用户
  94. User user = this.userDao.getOne(1L);
  95.  
  96. //删除id为1的用户,级联删除用户对应的类型
  97. this.userDao.delete(user);
  98. }
  99.  
  100. }

spring data jpa 多对多 ManyToMany的更多相关文章

  1. spring data jpa 多对多查询

    package com.ytkj.dao; import com.ytkj.entity.Customer; import com.ytkj.entity.Role; import org.sprin ...

  2. Spring Data JPA 初体验

    一,JPA相关的概念 JPA概述 全称是:JavaPersistence API.是SUN公司推出的一套基于ORM的规范. Hibernate框架中提供了JPA的实现. JPA通过JDK 5.0注解或 ...

  3. Spring Data JPA实体详解

    1. Spring Data JPA实体概述 JPA提供了一种简单高效的方式来管理Java对象(POJO)到关系数据库的映射,此类Java对象称为JPA实体或简称实体.实体通常与底层数据库中的单个关系 ...

  4. Spring Data Jpa系列教程--------实体解析和关联关系

    Spring Data Jpa是基于HIbernate开发的,所以建立实体建的实体和映射关系需要好好好的去了解一下,本文有以下内容,实体管理器介绍,实体与数据库表的映射介绍,关联关系(一对多,多对多) ...

  5. spring data jpa使用 (转:http://www.manongjc.com/article/25284.html#four_1_7)

    Jap相关的使用 时间:2018-12-18 本文章向大家介绍Jap相关的使用,主要包括Jap相关的使用使用实例.应用技巧.基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下. ...

  6. Spring Data JPA入门及深入

    一:Spring Data JPA简介 Spring Data JPA 是 Spring 基于 ORM 框架.JPA 规范的基础上封装的一套JPA应用框架,可使开发者用极简的代码即可实现对数据库的访问 ...

  7. SpringBoot学习笔记:Spring Data Jpa的使用

    更多请关注公众号 Spring Data Jpa 简介 JPA JPA(Java Persistence API)意即Java持久化API,是Sun官方在JDK5.0后提出的Java持久化规范(JSR ...

  8. Spring data JPA 理解(默认查询 自定义查询 分页查询)及no session 三种处理方法

    简介:Spring Data JPA 其实就是JDK方式(还有一种cglib的方式需要Class)的动态代理 (需要一个接口 有一大堆接口最上边的是Repository接口来自org.springfr ...

  9. Spring Boot + Spring Data JPA + PostgreSQL

    最近在用Java重写之前实习生用.netcore写的微信后台应用. 规定用Spring Boot框架,PostgreSQL数据库.之前一直习惯于基于XML的Spring app,也没用过Postgre ...

随机推荐

  1. 定位new表达式与显式调用析构函数

    C++的核心理念之一是RAII,Resource Acquisition Is Initialization,资源获取即初始化.资源有很多种,内存.互斥锁.文件.套接字等:RAII可以用来实现一种与作 ...

  2. stand up meeting 11/27/2015-11/29/2015

    part 组员 今日工作 工作耗时/h 明日计划 工作耗时/h UI 冯晓云   确定释义显示方案并进行代码实现:     4  完成UI设计的各项动能按钮的代码实现  6 数据库 朱玉影  导入了4 ...

  3. 微信小程序 —搜索框

    wxSearch优雅的微信小程序搜索框 一.功能 支持自定义热门key 支持搜索历史 支持搜索建议 支持搜索历史(记录)缓存 二.使用 1.将wxSearch文件夹整个拷贝到根目录下 2.引入 // ...

  4. JS Math&Date的方法 (上)

    数学对象&时间对象 本篇文章主要介绍Math 和 Date  的常用方法! 一 :Math & Date         Math 数学对象 - 处理数学计算和数学类          ...

  5. 利用Putty建立SSH的tunnels访问内网资源

    适用场景访问阿里或者腾讯云只针对内网开放的资源. 本文以SQLSERVER 举例 举例你的内网 SQLSERVER的访问地址是192.168.33.88 . 你的Microsoft SQL Serve ...

  6. [YII2] 自带分页调整

    在search Model的search()方法里有一个$dataProvider 属性 ,在这个属性数组里添加 'pagination' => ['pageSize' => 10,],设 ...

  7. pytorch中CUDA类型的转换

    import torch import numpy as np device = torch.device("cuda:0" if torch.cuda.is_available( ...

  8. Thymeleaf入门入门入门入门入门入门入门入门入门入门入门

    Thymeleaf 官网部分翻译:反正就是各种好 Thymeleaf是用来开发Web和独立环境项目的服务器端的Java模版引擎 Spring官方支持的服务的渲染模板中,并不包含jsp.而是Thymel ...

  9. 2019-2020-1 20199329《Linux内核原理与分析》第一周作业

    Linux学习随笔 Linux 是一个操作系统,我们的 Linux 主要是系统调用和内核那两层. UNIX前身是Multics,但 UNIX 的商业版本非常昂贵,于是Linus Torvalds(Li ...

  10. String、String[]、ArrayList<String>之间的转换

    1. ArrayList<String> 转换为 String[]: ArrayList<String>  list = new ArrayList<>(); li ...