[spring] spring jpa - hibernate 名词解释配置
[spring] spring jpa - hibernate 名词解释&配置
之前过了一遍依赖注入的内容,这次过一下数据相关的部分,完成了这部分内容,下篇就涉及到 API 实现了
操作的部分放到下一篇,本篇主要是概念+配置
整体课程上来说,已经完成了将近 1/3,年底之前应该说可以把 spring boot 相关的内容滚完
名词解释
在开始用 jpa/hibernate 之前,先开始解释一些名词
-
MVC
MVC 和 spring 没有直接的关联,这是一个更加广泛的,关于 Model-View-Controller 设计模式,其中:
-
Model
代表数据和业务逻辑相关内容,简单的说就是负责和数据库交流,并且进行数据更新的部分
-
View
渲染层,直接和用户进行互动的部分,包括从后台获取数据,在前台和用户互动,并且获取用户输入,传输到后台
-
Controller
负责沟通 model 和 view 的桥梁,将从 view 接收到的数据传给 model 进行数据更新,将从 model 获取的数据传给前台进行渲染
一些比较流行的 MVC 框架有 Ruby,Django(python),Spring MVC(java)express(js),ASP .NET MVC(C#)
-
-
SSH
Struts-Spring-Hibernate 框架的缩写,其中 Struts 代表着 View 结构,Spring 是负责 Controller+Model,而 Hibernate 则负责协助和数据库沟通,也是 Model 的一部分
-
SSM
即 Spring+Spring MVC+Mybatis
这里 Spring 也是负责 Controller+Model 部分,Spring MVC 负责渲染,而 Mybatis 代替了 Hibernate,负责协助数据库的沟通
-
ORM
Object-Relationship Mapping
使用该框架可以通过映射对象(Object)与关系型数据库(Relational DB),让开发者免于写 SQL,而是直接对对象进行操作即可
比较流行的 ORM 有:Hibernate(Java),ActiveRecord(Ruby),Django’s ORM(Python),Entity Framework(.Net),Sequelize(JS,Node)
-
Mybatis
Mybatis 是 SQL 映射框架,学习门槛较低,上手较快,因此在 SSM 框架中占据一席之地
基本上说 Mybatis 可以缩短写开发要写的 SQL,并且 MyBatis 负责与数据库进行沟通,提供比较高的灵活性
使用 MyBatis,开发者还是需要写自己的 SQL 的,它并不是一个 ORM 框架
-
Hibernate
Hibernate 是一个 ORM 框架,因此可以让开发者只操作 Java 对象,而 Hibernate 负责和数据库进行沟通
简而言之就是,Hibernate 借将对应的 java 对象与数据库进行映射,并实现 SQL 操作
Hibernate 是 Spring Boot 的默认 JPA Provider,它本质上还是调用 JDBC 去实现具体的数据库操作
-
JPA
Java Persistence API 的缩写,这是 API 规范,Hibernate 就是实现了 JPA 的 ORM 框架
换言之,除了 Hibernate 之外,还有其他的框架也实现了 JPA,如 EclipseLink
⚠️:JPA 好像已经改名成了 Jakarta Persistence API
-
Spring JPA
提供了 boilerplate code 用来加速 JDBC 的操作
使用 Spring JPA 必须要有一个 JPA provider,比较流行的 provider 就是 Hibernate
没有 Provider,Spring JPA 无法实现和数据库的沟通
这样大概就能解释一点 JPA、Spring JPA 和 Hibernate 之间的关系了……?
配置
配置 spring initializr
主要就是额外加了两个 dependencies:
配置数据库
配置数据库这块主要是从 application.properties
里面配置,我配置的内容如下:
spring.datasource.url=jdbc:mysql://127.0.0.1:3306/student_tracker
spring.datasource.username=springstudent
spring.datasource.password=springstudent
# deprecated
#spring.jpa.database-platform=org.hibernate.dialect.MySQL8Dialect
# use org.hibernate.dialect.MySQLDialect instead
spring.jpa.database-platform=org.hibernate.dialect.MySQLDialect
这个配置还是比较简单的,运行结果如下:
补充一下: 我创建了对应的用户和密码,没有创建的话,使用默认的用户名和密码 root
也可以
配置中可能遇到的问题
虽然这个步骤很快,但是实际上我在这一步卡了半天,主要碰到下面几个问题:
-
缺少
dialect
教程里给的配置没有
spring.jpa.database
,后面 Google 了一下加了 MySQL8Dialect -
typo
应该是
org.hibernate.dialect.MySQL8Dialect
,我漏了个org
-
数据库不 match
教程里用的是 MySQL,我本地的数据库是 MariaDB v11
后面我试着切换 MariaDB 106 的 Dialect,然后发现 POM 又要更新,折腾若干次未果,后面还是重新下载了一个 MySQL 才跑通
所以说,数据库的版本还是要和 Hibernate 提供的 Dialect 符合,我怀疑 MariaDB11 和 106 不兼容(因为有个大版本的差别)
-
本地重装数据库冲突
MariaDB 曾经是 MySQL 的套壳,不过现在两个差别越来越大了……
brew 卸载 maria 的话还是删的比较干净的,不过删 MySQL 的时候有个残存的文件夹,这样我重新下载其他的 DB(Maria/MySQL)就会启动失败,解决方案是彻底删除残留的文件夹,再重新安装就好了
我用的脚本为:
❯ brew uninstall mysql ❯ rm -Rf /usr/local/var/mysql ❯ brew install mysql ❯ mysql.server start
配置完成了后,spring boot 就会根据配置自动创建对应的 DataSource
, EntityManager
等数据库相关的 bean
项目配置
因为 CRUD 的操作比较麻烦,所以教程里面使用的是 CLI,具体内容如下:
package com.example.hibernatejpa;import com.example.hibernatejpa.dao.StudentDAO;
import com.example.hibernatejpa.entity.Student;
import org.springframework.boot.CommandLineRunner;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.annotation.Bean;@SpringBootApplication
public class HibernateJpaApplication {public static void main(String[] args) {SpringApplication.run(HibernateJpaApplication.class, args);}@Beanpublic CommandLineRunner commandLineRunner(StudentDAO studentDAO) {return runner -> System.out.println("Hello World");}
}
commandLineRunner
主要是在 Spring 启动后会执行一些命令行输出语句,比如说这里就 log 了一下 Hello World
:
这里也可以修改一下 properties 文件,减少一点 log 的输出:
spring.main.banner-mode=off
logging.level.root=warn
修改了之后,info
相关的内容和 Spring 的 banner 就不会被输出了:
JPA 注解
一些本篇笔记会用到的注解如下:
-
Entity Mapping
@Entity
,@Table
-
Primary Key
@Id
,@GeneratedValue
-
Columnh Mapping
@Column
-
Relationship
这个案例里暂时不会用到,不过是这种关系:
@OneToOne
等 -
Query
@NamedQuery
-
来自 Spring
@Transactional
代表这会对数据进行 mutation,这里面具体操作还挺复杂的,涉及到 rollback 等操作,之后看看课程里会不会讲,不会的话我抽空研究一下
这种很多,不过用到了再了解就是了
一些类,如 EntityManager
, DataSource
,Spring 会根据配置自动生成,后面直接拿来用就好了
操作流程如下:
-
定义 Entity Object
JPA 会将这个类与数据库中的 entity 进行 mapping,这也是为什么会有
@Entity
这个注解的来源- Student
package com.example.hibernatejpa.entity;import jakarta.persistence.*;@Entity @Table(name = "student") public class Student { }
@Table
指代的则是数据库里student
这个表 -
进行数据映射
@Entity@Table(name = "student")public class Student {// defined fields@Id@GeneratedValue(strategy = GenerationType.IDENTITY)@Column(name = "Id")private int id;@Column(name = "first_name")private String firstName;@Column(name = "last_name")private String lastName;@Column(name = "email")private String email;public Student() {}public Student(String firstName, String lastName, String email) {this.firstName = firstName;this.lastName = lastName;this.email = email;}}
这里需要一个无参构造函数让 hibernate 去使用反射创建对应的实例
这里将表格里有的数据和对象里的属性进行映射,毕竟数据库的结构如下:
@Column
是可选的,如果不提供的话数据库中的名字与 Java 中属性名相同。不过数 DB 的属性名称一般用的是 snake,java 用的是 camel,所以也不太推荐这么做另外就是,如果代码要更新(比如说换名称之类的),如果不注意这里没修改的话,有可能项目就跑不了了
同样,
@Table
这个注解也是可选的这里从数据库 map 的主键就是 id,
@GeneratedValue
也就是主键的生成方式为数据库管理,所以在创建新对象的时候不需要将主键传过去GenerationType
是可以 override 的,通过实现IdentifierGenerator
重写对应的方法即可
到这一步,ORM 的 mapping 这里就实现了
接下来就是重写 setter/getter/toString 方法,这里就跳过了
除了手动操作之外,也可以使用 lombok 去除重复的 setter/getter/无参构造函数
Reference
-
比较流行的一些 DB 的 Dialect
RDBMS Dialects DB2 org.hibernate.dialect.DB2Dialect DB2 AS/400 org.hibernate.dialect.DB2400Dialect DB2 OS390 org.hibernate.dialect.DB2390Dialect PostgreSQL org.hibernate.dialect.PostgreSQLDialect MySQL5 org.hibernate.dialect.MySQL5Dialect MySQL5 with InnoDB org.hibernate.dialect.MySQL5InnoDBDialect MySQL with MyISAM org.hibernate.dialect.MySQLMyISAMDialect Oracle (any version) org.hibernate.dialect.OracleDialect Oracle 9i org.hibernate.dialect.Oracle9iDialect Sybase org.hibernate.dialect.SybaseASE15Dialect Microsoft SQL Server 2000 org.hibernate.dialect.SQLServerDialect Microsoft SQL Server 2008 org.hibernate.dialect.SQLServer2008Dialect SAP DB org.hibernate.dialect.SAPDBDialect Informix org.hibernate.dialect.InformixDialect HypersonicSQL org.hibernate.dialect.HSQLDialect H2 Database org.hibernate.dialect.H2Dialect Ingres org.hibernate.dialect.IngresDialect Progress org.hibernate.dialect.ProgressDialect Mckoi SQL org.hibernate.dialect.MckoiDialect Interbase org.hibernate.dialect.InterbaseDialect Pointbase org.hibernate.dialect.PointbaseDialect FrontBase org.hibernate.dialect.FrontbaseDialect Firebird org.hibernate.dialect.FirebirdDialect 不是非常 up-to-date,MySQL8Dialect 都 deprecated 了,我现在用的 MySQL 版本是 8,不过做一个参考还行
-
Mysql start up issues | ERROR! The server quit without updating PID file
相关文章:

[spring] spring jpa - hibernate 名词解释配置
[spring] spring jpa - hibernate 名词解释&配置 之前过了一遍依赖注入的内容,这次过一下数据相关的部分,完成了这部分内容,下篇就涉及到 API 实现了 操作的部分放到下一篇,本篇主要是概念配置 整体课程上来说,…...

java判断字符串是否为时间格式
要判断一个字符串是否为时间格式,可以使用Java中的正则表达式来检查字符串是否符合时间格式的模式。以下是一个示例,演示如何使用正则表达式来判断一个字符串是否为时间格式: import java.util.regex.Matcher; import java.util.regex.Patte…...

【Java】什么是API
API (Application Programming Interface,应用程序编程接口) Java中的API 指的就是 JDK 中提供的各种功能的 Java类,这些类将底层封装起来,我们不需要关心这些类是如何实现的,只需要学习这些类如何使用即可,我们可以通过帮助文档…...

Hazelcast系列(三):hazelcast集成(服务器/客户端)
系列文章 Hazelcast系列(一):初识hazelcast Hazelcast系列(二):hazelcast集成(嵌入式) Hazelcast系列(三):hazelcast集成(服务器/客户端) Hazelcast系列(四):hazelcast管理中心 …...

vscode 配置默认shell
vscode 配置默认shell 最简单方式 "terminal.integrated.defaultProfile.osx": "zsh", 也可以自定义,参考 https://code.visualstudio.com/docs/terminal/profiles terminal 修改默认shell change your default shell to zsh chsh -s /bin/…...

品牌低价的形式有哪些
线上产品五花八门,价格也有高低,但有时同一款商品,看似页面价一样,计算完促销信息后的到手价都会有所不同,有些店铺甚至会使用隐藏优惠券,如咨询客服领券、新人券等,而这些丰富的优惠方式&#…...

SPA项目之主页面--数据表格的增删改查
SPA项目之主页面--数据表格的增删改查 一.增删改查1.样式准备2.增加3.删除4.修改5.查询二.表单验证1.在表单中使用验证规则 一.增删改查 1.样式准备 <template><div class"books" style"padding: 20px;"><el-form :inline"true"…...

Adobe Premiere Pro:掌控视频剪辑的魔法之手,让你的创作腾飞!
🎉🎉欢迎来到我的CSDN主页!🎉🎉 🏅我是尘缘,一个在CSDN分享笔记的博主。📚📚 👉点击这里,就可以查看我的主页啦!👇&#x…...

ES知识点全面整理
● 我们从很多年前就知道 ES6, 也就是官方发布的 ES2015 ● 从 2015 年开始, 官方觉得大家命名太乱了, 所以决定以年份命名 ● 但是大家还是习惯了叫做 ES6, 不过这不重要 ● 重要的是, ES6 关注的人非常多, 大家也会主动去关注 ● 但是从 2016 年以后, 每年官方都会出现新…...

【电商API封装接口】电商百万商品资源一键导入,助力企业流量变现
电商API接口是淘宝开放平台提供的一组数据接口,供开发者使用来获取淘宝平台上商品、店铺、订单等相关信息。根据功能和分类,淘宝API主要包括以下几个方面: 1. 商品API:提供了搜索、详情、评价等与商品相关的接口,可以…...

bootz启动 Linux内核过程中涉及的全局变量images
一. bootz启动Linux uboot 启动Linux内核使用bootz命令。当然还有其它的启动命令,例如,bootm命令等等。 本文只分析 bootz命令启动 Linux内核的过程。 本文具体分析 bootz启动 Linux内核过程涉及的一个重要的全局变量 images。 二. bootz 启动 Linux…...

Vuex的使用,详细易懂
目录 一.前言 二.Vuex的简介 三.vuex的使用 3.1 安装Vuex 3.2 使用Vuex的步骤: 四.vuex的存值取值(改变值) 五.vuex的异步请求 好啦,今天的分享就到这啦!!! 一.前言 今天我们继续前面的E…...

基于多线程的Reactor模式的 回声服务器 EchoServer
记录下 一个线程专门用来接受accept获取客户端的fd 获取fd之后 从剩余的执行线程中 找到一个连接客户端数量最少的线程 然后将客户端的fd加入到这个线程中并通过EPOLL监听这个fd 线程之间通过eventfd来通信 将客户端的fd传到 对应的线程中 参考了MediaServer 引入…...

《TWS蓝牙耳机通信原理与接口技术》
+他V hezkz17进数字音频系统研究开发交流答疑群(课题组) 耳机BT与手机BT通信 主耳与从耳通信 耳机BLE盒手机BLE通信 充电盒与耳机通信 上位机与耳机通信 上位机与充电盒通信 1 耳机BT与手机BT通信 传输音频数据传递控制信息 (3) 耳机BLE与手机BLE通信 安卓/苹果app-耳机…...

敏捷开发使用
1.敏捷开发 敏捷开发以用户的需求进化为核心,采用迭代、循序渐进的方法进行软件开发。在敏捷开发中,软件项目在构建初期被切分成多个子项目,各个子项目的成果都经过测试,具备可视、可集成和可运行使用的特征。换言之,就…...

cdsn目录处理:```,```# 目录校正
原标题 <small> cdsn目录处理: ,中间添加 # 空格 空行后 遇到的底部空行出错,书接上回,处理空行【python查找替换:查找空行,空行前后添加,中间添加 # 空格 空行后遇到的第1行文字&am…...

前端TypeScript学习day03-TS高级类型
(创作不易,感谢有你,你的支持,就是我前行的最大动力,如果看完对你有帮助,请留下您的足迹) 目录 TypeScript 高级类型 class 类 class继承 extends implements 类成员可见性 public protected …...

LeetCode-101-对称二叉树
题目描述: 给你一个二叉树的根节点 root , 检查它是否轴对称。 题目链接:LeetCode-101-对称二叉树 解题思路:判断2个二叉树是否可以相互翻转,考察同时处理2个二叉树的遍历情况。 代码实现: class Solution …...

9-AJAX-上-原理详解
一、定义 1、什么是Ajax Ajax:即异步 JavaScript 和XML。Ajax是一种用于创建快速动态网页的技术。通过在后台与进行少量数据交换,Ajax可以使网页实现异步更新。这意味着可以在不重新加载整个网页的情况下,对网页的某部分进行更新。而传统的…...

Python3操作Redis最新版|CRUD基本操作(保姆级)
Python3中类的高级语法及实战 Python3(基础|高级)语法实战(|多线程|多进程|线程池|进程池技术)|多线程安全问题解决方案 Python3数据科学包系列(一):数据分析实战 Python3数据科学包系列(二):数据分析实战 Python3数据科学包系列(三):数据分析实战 Win11查看安装的Python路…...

微信又被吐槽了,委屈啊
昨天的时候,一打开微博热搜榜,一看,微信又被吐槽了,微信占用存储这件事几乎年年会被骂,几乎也会年年被吐槽。 这次的起因呢,是一个人整理了一个方法:「微信内存从 126G 清理到 75G 我是怎么做到…...

刷题笔记27——并查集
很长一段时间,我的生活看似马上就要开始了。但是总有一些障碍阻挡着,有些事得先解决,有些工作还有待完成,时间貌似不够用,还有一笔债务8要去付清,然后生活就会开始。最后我终于明白,这些障碍&am…...

Python 模拟类属性
文章目录 模拟类属性的原因模拟类属性的可能解决方案使用 PropertyMock 模拟类属性在不使用 PropertyMock 的情况下模拟类属性Python 模拟类构造函数使用 patch.object 装饰器来修补构造函数本文的主要目的是介绍如何使用 python 单元测试模块 unittest 操作类属性以进行测试和…...

面试算法24:反转链表
题目 定义一个函数,输入一个链表的头节点,反转该链表并输出反转后链表的头节点。例如,把图4.8(a)中的链表反转之后得到的链表如图4.8(b)所示。 分析 由于节点j的next指针指向了它的前一个节…...

【论文阅读】面向抽取和理解基于Transformer的自动作文评分模型的隐式评价标准(实验结果部分)
方法 结果 在这一部分,我们展示对于每个模型比较的聚合的统计分析当涉及到计算特征和独立的特征组(表格1),抽取功能组和对齐重要功能组(表格2),并且最后,我们提供从模型比较&#x…...

VueRouter与expres/koa中间件的关联
ueRouter: runQueue 路由守卫都是有三个参数to,from,next。其中next就是下方的fn执行时候传入的第二个参数(回调函数),只有该回调执行后才会挨个遍历queue内的守卫。 中间件的作用 隔离基础设施与业务逻辑之间的细节。详细的内容位于《深入浅出Node.js》P210 另外一…...

二十、SpringCloud Alibaba Seata处理分布式事务
目录 一、分布式事务问题1、分布式之前2、分布式之后 二、Seata简介1、Seata是什么?2、Seata能干嘛?3、去拿下?4、怎么玩 三、Seata-server安装四、订单、库存、账户业务数据库准备五、订单、库存、账户业务微服务准备六、Seata原理介绍 一、…...

标准误与聚类稳健标准误的理解
1 标准误 1.1 定义 标准误(Standard Error)是用来衡量统计样本估计量(如均值、回归系数等)与总体参数之间的差异的一种统计量。标准误衡量了样本估计量的变异程度,提供了对总体参数的估计的不确定性的度量。标准误越…...

【Github】将本地仓库同步到github上
许久没有用GitHub了,怎么传仓库都忘记了。在这里记录一下 If you have a local folder on your machine and you want to transform it into a GitHub repository, follow the steps below: 1. Install Git (if not already installed) Make sure you have Git in…...

c++视觉--通道分离,合并处理,在分离的通道中的ROI感兴趣区域里添加logo图片
c视觉–通道分离,合并处理 通道分离: split()函数 #include <opencv2/opencv.hpp>int main() {// 读取图像cv::Mat image cv::imread("1.jpg");// 检查图像是否成功加载if (image.empty()) {std::cerr << "Error: Could not read the…...