jpa笔记

2023-11-13

ORM思想

主要目的:操作实体类就相当于操作数据库表

建立两个映射关系:

     实体类和表的映射关系

实体类中属性与表中字段的映射关系

不再重点关注:sql语句

JPA规范

jpa规范,实现jpa规范,内部是由接口和抽象类组成

实体类

配置映射关系:

      1. 实体类和表的映射关系
      2. 实体类中属性和表中字段的映射关系

@Id :声明主键的配置

@Generated:配置主键的生成策略

strategy  

GenerationType.IDENTITY:自增

            *底层数据库必须支持自动增长(底层数据库支持的自动增长方式,对id自增)

GenerationType.SEQUENCE:序列,Oracle

            *底层数据库必须支持序列

GenerationType.Table : jpa提供的一种机制,通过一张数据库表的形式帮助我们完成主键自增

GenerationType.AUTO: 有程序自动的帮助我们选择主键生成策略

@Column(columnDefinition = "int8")

           name:数据库表中字段的名称

           columnDefinition:

@Entity //声明实体类 
@Table //配置实体类和表的映射关系 //name:配置数据库表的名称 
@Table(name = "stdent")

package com.oceanPlatform.inner.cargo.entity; 
import io.swagger.annotations.ApiModel; 
import io.swagger.annotations.ApiModelProperty; 
import lombok.Data; 
import javax.persistence.Column; 
import javax.persistence.Entity; 
import javax.persistence.Id; 
import javax.persistence.Table; 


@Entity 
@Data 
@ApiModel(value = "student对象", description = "学生信息表") 
@Table(name = "student") 
public class StudentEntity { 
/** 
* @Id声明主键的配置 
* @Generated(strategy = GenerationType.IDENTITY):配置主键的生成策略(自增) * @Column(columnDefinition = "int8") 
* name:数据库表中字段的名称 * columnDefinition: 
**/ 
@Id 
@ApiModelProperty(value = "主键") 
@Column(columnDefinition = "int8") 
private Long id; 
@ApiModelProperty(value = "附件路径") 
@Column(columnDefinition = "varchar(255)") 
private String file; 
 
}

延迟加载(懒加载)getReference() 常用

              得到的是一个动态代理对象

              什么时候用,什么时候才会查询

立即加载 fine

SpringDataJpa

  1. 搭建环境

创建工程导入坐标

配置spring的配置文件

编写实体类,使用jpa注解配置映射关系

<!-- 数据库驱动--> 
spring.datasource.driver-class-name=org.postgresql.Driver 
<!-- 数据库连接--> 
spring.datasource.url=jdbc:postgresql://127.0.0.1:5432/post spring.datasource.username=postgres spring.datasource.password=postgres 
<!-- --> 
spring.jpa.hibernate.ddl-auto=update 
<!-- 是否显示SQL--> 
spring.jpa.show-sql=false 
<!-- 数据库方言:支持的特有语法--> 
spring.jpa.properties.hibernate.dialect = org.hibernate.dialect.PostgreSQL9Dialect spring.jpa.properties.hibernate.temp.use_jdbc_metadata_defaults = false
      1. 编写一个符合springDataJpa的Dao 层接口

Dao层接口规范

    需要继承两个接口(JpaRepository,JpaSpecificationExecutor

    需要提供相应的泛型

JpaRepository

     封装了基本的CRUD(增删改查)操作

JpaSpecificationExecutor

    封装了复杂查询(分页)

@Repository 
public interface StudentRepository extends JpaRepository<StudentEntity, Long>, JpaSpecificationExecutor { 
@Modifying 
@Query(value = "delete FROM student where id = ?1",nativeQuery = true) 
void deleteAllById(long id); 
Integer countById(Long id); 
}

save: 保存或者更新

    根据传递的对象是否存在主键id

    如果没有id主键属性,保存

    存在id主键,根据id查询数据库,更新数据

simpleJpaRepository

      实现了JpaRepository接口,实现了JpaSpecificationExecutor接口

      对基本的增删改查操作进行了封装

springdataJpa的运行过程和原理剖析

    1. 通过JDKDynamicAopProxy的invoke方法创建了一个动态代理对象
    2. SimpleJpaRepository当中封装了JPA的操作(借助JPA的api完成数据库的CRUD)
    3. 通过hibernate完成数据库操作(封装了jdbc)

@Transactional:保证getOne正常运行

findOne 与getOne

  findOne:

     em.find() :立即加载

getOne:

     em.getReference() :延迟加载

复杂查询

  1. 借助接口中的定义好的方法完成查询

findOne(id):根据id查询

  1. jpql的查询方式

jpql:jpa query language(jpa查询语言)

  特点:语法或关键字和SQL语句类似

  查询的是类和类中的属性

  需要将JPQL语句配置到接口方法上

    1. 特有的查询:需要在dao接口上配置方法
    2. 在新添加的方法上,使用注解的形式配置jpql查询语句
    3. 注解: @Query

代表的是进行查询

声明此方法用来进行更新操作

@Transactional 
@Modifying 
@Query(value = "update StudentEntity s set s.Stat = false where s.id = :id") 

方法名约定:

   findBy:查询

         对象中的属性名(首字母大写);查询条件

         findByStudentName 根据学生名查询

         默认情况,使用 等于的方式查询

特殊的查询方式

在springdataJpa的运行阶段

会根据方法名进行解析 findBy from xxx(实体类)

属性名称 where studentName

Specifications动态查询

Specification:查询条件

   实现Specification接口(提供泛型:查询的对象类型)

   实现toPredicate方法(构造查询条件)

   需要借助方法参数中的两个参数(

root:获取需要查询的两个参数

criteriaQuery

criteriaBuilder:构造查询条件,内部封装了很多的查询条件(模糊匹配,精准匹配)

equal :直接得到path对象(属性),然后进行比较即可

gt, lt, ge, like:得到path对象,然后根据path指定比较的参数类型,再去比较

指定参数类型,path.as(类型的字节码对象)

//分页参数设置 
Pageable pageable = PageRequest.of(pagination.getCurrent() - 1, pagination.getPagesize(), sort);

private Specification<StudentEntity> queryCondition(StudentSearchModel queryModel) { return (Specification<StudentEntity>) (root, criteriaQuery, criteriaBuilder) -> { List<Predicate> predicates = new ArrayList<>(); 
//学号查询 equal:进行精准匹配(比较的属性,比较的属性的取值) 
if (!StringUtils.isEmpty(queryModel.getStudentId())) { predicates.add(criteriaBuilder.equal(root.get("studentId"), queryModel.getStudentId())); } 
//root.get("studentId") 获取属性 
//学期开始查询
if (!StringUtils.isEmpty(queryModel.getTermStartDate())) { predicates.add(criteriaBuilder.greaterThanOrEqualTo(root.get("termStartDate"), queryModel.getTermStartDate())); 
} 
return criteriaBuilder.and(predicates.toArray(new Predicate[predicates.size()])); 
}; 
}

多表查询:

多表之间的关系和操作多表的操作步骤

表关系

一对一

一对多

一的一方:主表

多的一方:从表

外键:需要再从表上新建一列作为外键,它的取值来源于主表的主键

多对多

中间表:中间表中最少应该有两个字段组成,这两个字段作为外键指向两张表的主键,又组成了联合主键

实力类中的关系:

包含关系:可以通过实体类中的包含关系描述表关系

继承关系

  1. 一对一操作
  1. 多对多操作

配置一对多关系

//@Fetch(FetchMode.JOIN) 
 @OrderBy("sort ASC") 
//CascadeType.PERSIST:级联新增(又称级联保存) 
 @OneToMany(cascade=CascadeType.ALL,orphanRemoval = 
 true,fetch=FetchType.LAZY,mappedBy="voyageId") 
 @NotFound(action = NotFoundAction.IGNORE) 
 private List<StudentEntity> studentEntities;

使用注解的形式配置多表关系

  1. 声明关系

@OnetoMany:配置一对多关系

  targetEntity:对方对象的字节码对象

  mappedBy="studentId":我的一对多映射参照对方属性,在一的一方放弃了外键的维护权

  fetch=FetchType.EAGER:立即加载

  fetch=FetchType.LAZY:延迟加载

  配置外键(中间表)

  @JoinColum:配置外键

  name: 外键字段名称

  referencedColumnName: 参照的主表的主键字段名称

@ManyToOne(fetch=FetchType.EAGER) 
@JoinColumn(name="class_id")
//student_id字段作为外键 
@ApiModelProperty(value = "班级id") 
private ClassEntity classId;

级联

操作一个对象的同时操作他的关联对象

级联添加

案例:当我保存一个客户的同时保存他的联系人

级联删除

案例:当我删除一个客户的同时删除他的联系人

@ManyToMany

@ManyToMany(fetch = FetchType.LAZY) 
@JoinTable(name = "rp_role_menu",
//设置中间表的名字,以及中间表的字段名 
          joinColumns = {@JoinColumn(name="roleId")},//joinColumns, 当前对象在中间表中的外键 
          inverseJoinColumns = @JoinColumn(name="menuId")//inverseJoinColumns, 对方对象在中间表的外键

希望以上笔记会对你对jpa学习提供帮助

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

jpa笔记 的相关文章

  • 使用 SqlBulkCopy 和 Azure 并行批量插入

    我在云上有一个带有 sql azure 数据库的 azure 应用程序 我有一个辅助角色 需要对文件 最多约 3000 万行 进行解析 处理 因此我无法直接使用 BCP 或 SSIS 我目前正在使用 SqlBulkCopy 但这似乎太慢了
  • 数组 (UUID[ ]) 会破坏 1NF 吗?

    我的问题是包含 UUID 数组的字段是否会破坏范式 http en wikipedia org wiki Database normalization 在包含数组之前位于 NF 中的表中 原表 CREATE TABLE Floor Floo
  • 哪些 ORM 与 Scala 配合得很好? [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • 在 DataGrip JetBrains 中创建新数据库

    任何人都知道如何创建新数据库DataGrip https goo gl 99xqGb JetBrains 的数据库 IDE 找不到DataGrip 帮助页面 https goo gl pnFpGS In 数据夹2017 1 https bl
  • 在实时计算机上更新(或替换)整个数据库表的最佳方法是什么?

    我每周都会收到一个数据源 我将对其进行解析并放入数据库中 数据每周不会有太大变化 但我应该定期更新数据库 除了每周更新外 数据是静态的 目前重建整个数据库不是问题 但最终该数据库将上线 人们可以在我重建数据库时查询该数据库 数据量并不小 几
  • 如何在postgresql中查找具有特定列的表

    我正在使用 PostgreSQL 9 1 我有一个表的列名 是否可以找到具有此列的表 如果是这样 怎么办 你也可以做 select table name from information schema columns where colum
  • 如何在 Delphi DBLookupComboBox 中选择正确的项目

    我有一个数据库查找组合框连接到数据库查询 那部分工作正常 当我运行程序时数据库查找组合框填充有查询的结果 我想看看数据库查找组合框填充第一项 请选择 当 的时候程序第一次运行或者当一个新项目行动已启动 见下图 另外 如果我正在加载以前保存的
  • 对于数据库来说,选择正确的数据类型会影响性能吗?

    如果是这样 为什么 我的意思是 tinyint 的搜索速度比 int 快吗 如果是这样 性能上的实际差异是什么 是的 根据数据类型 它确实有所不同 int vs tinyint不会在速度上产生明显的差异 但会在数据大小上产生差异 假设tin
  • Sequelize.js - “不关联到”

    我在从数据库获取完整数据时遇到一些问题 那是我的模型 User module exports function sequelize DataTypes return sequelize define user id type DataTyp
  • Scrapy - 持续从数据库中获取要爬取的url

    我想不断地从数据库中获取要爬行的网址 到目前为止 我成功地从基地获取了 url 但我希望我的蜘蛛继续从该基地读取 因为该表将由另一个线程填充 我有一个管道 一旦爬行 工作 就会从表中删除 url 换句话说 我想使用我的数据库作为队列 我尝试
  • 使用 where 进行 select 语句时,HSQLDB 用户缺乏权限或未找到对象错误

    我的数据库使用 SQuirrel SQL 客户端版本 3 5 3 和 HSQLDB 我已经能够为其指定相应的驱动程序 内存中 并创建一个别名 我创建了一个表 CREATE TABLE ENTRY NAME VARCHAR 100 NOT N
  • 在 SQL 数据库中存储“列表”的最正确方法是什么?

    因此 我读了很多关于如何将多个值存储到一个列中是一个坏主意 并且违反了数据标准化的第一条规则 令人惊讶的是 这不是 不要谈论数据标准化 所以我需要一些帮助 目前我正在为我工 作的地方设计一个 ASP NET 网页 我想根据此人所属的 Act
  • 在标准化数据库模式中是否可以有多个外键?

    Address addressID houseNumber postcode roadName city county Reservation reservationID roomNo leadGuestID guest2ID guest3
  • 使用Python将文本文件导入Access 2003数据库

    我正在尝试使用我正在开发的 Python 3 4 应用程序将管道分隔的文本文件导入到具有现有表的 Access 数据库中 但遇到了一些麻烦 该应用程序将用于导入不同的文本文件 因此我使用条目小部件来写入文件名 并且我希望将输入的文件的内容加
  • WordPress:wpdb->插入与wpdb->准备(wpdb->查询(“INSERT

    我想知道 WordPress 的插入功能是否也向数据添加斜杠 如果没有 准备查询方法似乎可以更好地防止 SQL 注入 我尝试在 codex api 中查找问题 然而 它似乎没有记录 谢谢 这个问题有点老了 自从提出这个问题以来 法典可能已经
  • 有没有办法阻止 SQL Express 2008 空闲?

    我使用 SQL Express 2008 作为 Web 应用程序的后端 问题是 Web 应用程序是在工作时间使用的 因此有时在午餐或休息时间 如果 20 分钟内没有用户登录 SQL Express 将进入空闲状态模式并释放其缓存 我知道这一
  • 为 Zend 应用程序提供数据库处理程序的“正确”方法是什么

    假设您严格遵守某个组织的惯例Zend应用程序 http framework zend com manual en zend application html 您应该在哪里设置数据库处理程序以供应用程序开发人员访问 我知道如何设置ZendDb
  • 我应该用不可变或可变的数据结构来表示数据库数据吗?

    我目前正在使用 Scala 进行编程 但我想这适用于任何函数式编程语言 或者更确切地说 任何建议不变性并可以与数据库交互的编程语言 当我从数据库中获取数据时 我将其映射到模型数据结构 在函数式编程中 数据结构往往是不可变的 但是数据库中的数
  • 如何使用 django ORM 在外键字段上连接两个表?

    假设我有以下模型 class Position models Model name models CharField class PositionStats models Model position models ForeignKey P
  • rake db:migrate db:reset 和 db:schema:load 之间的区别

    和 之间的不同rake db migrate and rake db reset我很清楚 我不明白的是如何rake db schema load与前两者不同 只是为了确保我在同一页面上 rake db migrate 运行尚未运行的迁移 r

随机推荐

  • 使用jackson实现对象json相互转换(spring boot)

    之前的json转对象 对象转json 总是比较繁琐 不够简洁 自从接触到jackson之后 发现原来对象和json转换可以这么简单 拿一个天气预报的小例子来说明一下 如下图 若是有小误 还望指正 不说 直接上码 首先 在pom xml里弄好
  • 图像分辨率测试ISO12233 - 2017中文翻译

    译者序 目前的摄像头分辨率的测试 大多遵循ISO 12233标准 最近下载一份英文版的文档 和大家一起分享 仅供学习使用 目录 ISO 12233 Third Edition 2017 01 Foreword 前言 Introduction
  • Ant Design pro入门

    Ant Design pro入门 前言 一 了解Ant Design pro 二 使用步骤 1 快速入门 2 ant pro菜单 路由 前言 读此文章需要优先掌握知识 1 React 2 ts 3 Ant Design 一 了解Ant De
  • NLP学习(一)基础篇

    一 前言 2016年3月9日至15日和2017年5月23日至27日 分别在韩国首尔和中国嘉兴乌镇 韩国围棋九段棋手李世石 中国围棋九段棋手柯洁与人工智能围棋程序 阿尔法围棋 AlphaGo 之间的两场比赛 人类均以失败告终 更是激起了各种
  • 深度学习课程设计

    1 安装TensorFlow windows 命令窗口 pip install tensorflow 我之前已经安装过python 可能是因为安装python也安装了pip所以可以直接使用pip命令 之前下载过pycharm 但是没有激活
  • Ubuntu系统下pycharm导入numpy、sklearn等各类包的方法

    本方法适用于无法导入numpy pandas matplotlib sklearn等包 1 打开pycharm 点击左上角file gt setting gt Project gt Python Interpreter 2 点击 号后显示下
  • win10环境变量path误删(windows找不到文件%windir%\systempropertiesadvanced.exe)的解决办法

    首先给出错误 windows找不到文件 windir systempropertiesadvanced exe请确定文件是否正确后 再试一次 当时看到这个错误我真是绝望了 因为我各种百度找path变量怎么恢复 结果百度给一堆环境变量的设置方
  • java实现:《操作系统实验三》模拟内存管理

    固定分区分配 固定分区分配是最简单的一种多道程序存储管理方式 它将用户内存空间划分为若干个固定大小的区域 每个分区只装入一道作业 当有空闲分区时 便可以再从外存的后背作业队列中 选择适当大小的作业装入该分区 如此循环 优缺点 分区大小相等
  • MES管理系统在电子行业的作用和效益

    电子行业近年来发展很好 特别是MES管理系统对于生产的帮助 电子行业MES管理系统促进了行业的数字化转型 从而提高电子行业高效管理 使企业效益最大化 电子行业现状 1 产品 顶级企业只负责设计与销售 对于涉及制造的各级企业产品较多 并且产品
  • win版本的sqlmap报错解决

    原来好好地环境突然报如下错 查了好久资料 竟然没人遇到过 解决方法 python sqlmap py update 没想到吧 完美解决 原来是版本低的原因 我也是醉了 以此记录下
  • Nginx中location规则 与 URL重写(rewrite)详解

    1 Nginx中location与rewrite 1 1 location与rewrite常用的正则表达式 符号 作用 匹配输入字符串的起始位置 匹配输入字符串的结束位置 匹配前面的字符零次或多次 如 ol 能匹配 o 及 ol oll 匹
  • matlab转化上三角矩阵,怎么样把矩阵H变成【A B】,A为上三角矩阵

    p eye 21 21 p1 eye 21 21 pm c zeros 252 672 a1 1 21 a2 22 42 a3 43 63 a4 64 84 a5 85 105 a6 106 126 a7 127 147 a8 148 16
  • 学习笔记——IPSec

    目录 一 整个IPsec工作过程 二 IKE阶段1 三 IKE阶段2 四 IPsec协议 五 华为设备配置命令 一 安全提议 xxx proposal 二 IKE对等体 ike peer 三 IPSec安全框架 ipsec profile
  • Emgu CV3+C#图像处理(一):Emgu CV学习目录+EmguCV安装配置与使用

    EmguCV学习目录 Emgu CV3 C 图像处理 一 Emgu CV学习目录 EmguCV安装配置与使用 Emgu CV3 C 图像处理 二 EmguCV主要模块简介 Emgu CV3 C 图像处理 三 使用EmguCV进行简单图像处理
  • 【重磅更新】图形处理工具NCSS 2019重磅上线!

    NCSS软件提供了370多种全面的统计和图形工具 用以对数据进行分析和实现可视化 我们很高兴地宣布NCSS 2019已经更新 这是统计分析和图形软件的最新版本 我们相信您会发现改进的和新增的程序非常适合您的研究需求 NCSS 2019免费下
  • 语义分割总结(未完待续)

    一 综述 由于工作中很长一段时间都是在做语义分割系列的工作 所以这篇文章主要对自己用到的一些方法做个简单的总结 包括其优缺点等 以便日后能够及时复习查看 目前语义分割的方法主要集中在两个大的结构上 1 encode decode的结构 图像
  • 深入理解计算机系统(原书第三版)系列 第十一章 网络编程

    第十一章 网络编程
  • 【剑指offer】数据结构——数

    目录 数据结构 数 直接解 剑指offer 43 1 n 整数中 1 出现的次数 剑指offer 44 数字序列中某一位的数字 剑指offer 49 丑数 剑指offer 60 n个骰子的点数 剑指offer 62 圆圈中最后剩下的数字 剑
  • 安卓端小黄鸟抓包保姆级教程(附带全套工具,完美解决无网络和ROOT问题)

    抓包工具 1 vmos pro 2 小黄鸟 3 JustTrustMe 4 JustMeplus 5 JustMeAlreadly 6 MT管理工具 抓包环境 vmos pro 虚拟机安卓9版本中 抓包教程 一 安装所需工具 工具安装包我会
  • jpa笔记

    ORM思想 主要目的 操作实体类就相当于操作数据库表 建立两个映射关系 实体类和表的映射关系 实体类中属性与表中字段的映射关系 不再重点关注 sql语句 JPA规范 jpa规范 实现jpa规范 内部是由接口和抽象类组成 实体类 配置映射关系