【Spring Boot】Java 持久层 API:JPA

Java 持久层 API:JPA

  • 1.Spring Data
    • 1.1 主要模块
    • 1.2 社区模块
  • 2.JPA
  • 3.使用 JPA
    • 3.1 添加 JPA 和 MySQL 数据库的依赖
    • 3.2 配置数据库连接信息
  • 4.了解 JPA 注解和属性
    • 4.1 常用注解
    • 4.2 映射关系的注解
    • 4.3 映射关系的属性
  • 5.用 JPA 构建实体数据表

1.Spring Data

Spring Data 是 Spring 的一个子项目,旨在统一和简化各类型数据的持久化存储方式,而不拘泥于是关系型数据库还是 NoSQL 数据库。

无论是哪种持久化存储方式,数据访问对象Data Access ObjectsDAO)都会提供对对象的增加、删除、修改和查询的方法,以及排序和分页方法等。

Spring Data 提供了基于这些层面的统一接口(如:CrudRepository、PagingAndSortingRepository),以实现持久化的存储。

Spring Data 包含多个子模块,主要分为主模块和社区模块。

1.1 主要模块

模块名称
作用
Spring Data Commons提供共享的基础框架,适合各个子项目使用,支持跨数据库持久化。
Spring Data JDBC提供了对 JDBC 的支持,其中封装了 JDBCTemplate。
Spring Data JDBC Ext提供了对 JDBC 的支持,并扩展了标准的 JDBC,支持 Oracle RAD、高级队列和高级数据类型。
Spring Data JPA简化创建 JPA 数据访问层和跨存储的持久层功能。
Spring Data KeyValue集成了 Redis 和 Riak,提供多个常用场景下的简单封装,便于构建 key-value 模块。
Spring Data LDAP集成了 Spring Data repository 对 Spring LDAP 的支持。
Spring Data MongoDB集成了对数据库 MongoDB 支持。
Spring Data Redis集成了对 Redis 的支持。
Spring Data REST集成了对 RESTful 资源的支持。
Spring Data for Apache Cassandra集成了对大规模、高可用数据源 Apache Cassandra 的支持。
Spring Data for Apace Geode集成了对 Apache Geode 的支持。
Spring Data for Apache Solr集成了对 Apache Solr 的支持。
Spring Data for Pivotal GemFire集成了对 Pivotal GemFire 的支持。

1.2 社区模块

模块名称
作用
Spring Data Aerospike集成了对 Aerospike 的支持
Spring Data ArangoDB集成了对 ArangoDB 的支持。
Spring Data Couchbase集成了对 Couchbase 的支持。
Spring Data Azure Cosmos DB集成了对 Azure Cosmos 的支持。
Spring Data Cloud Datastore集成了对 Google Datastore 的支持
Spring Data Cloud Spanner集成了对 Google Spanner 的支持。
Spring Data DynamoDB集成了对 DynamoDB 的支持。
Spring Data Elasticsearch集成了对搜索引擎框架 Elasticsearch 的支持。
Spring Data Hazelcast集成了对 Hazelcast 的支持。
Spring Data Jest集成了对基于 Jest REST client 的 Elasticsearch 的支持。
Spring Data Neo4j集成了对 Neo4j 数据库的支持。
Spring Data Vault集成了对 Vault 的支持。

2.JPA

JPA(Java Persistence APl)是 Java 的持久化 API,用于对象的持久化。它是一个非常强大的 ORM 持久化的解决方案,免去了使用 JDBCTemplate 开发的编写脚本工作。JPA 通过简单约定好接口方法的规则自动生成相应的 JPQL 语句,然后映射成 POJO 对象。

JPA 是一个规范化接口,封装了 Hibernate 的操作作为默认实现,让用户不通过任何配置即可完成数据库的操作。JPA、Spring Data 和 Hibernate 的关系如下图所示。
在这里插入图片描述
Hibernate 主要通过 hibernate-annotationhibernate-entitymanagerhibernate-core 三个组件来操作数据。

  • hibernate-annotation:是 Hibernate 支持 annotation 方式配置的基础,它包括标准的 JPAannotation、Hibernate 自身特殊功能的 annotation。
  • hibernate-core:是 Hibernate 的核心实现,提供了 Hibernate 所有的核心功能。
  • hibernate-entitymanager:实现了标准的 JPA,它是 hibernate-core 和 JPA 之间的适配器,它不直接提供 ORM 的功能,而是对 hibernate-core 进行封装,使得 Hibernate 符合 JPA 的规范。

如果要 JPA 创建《Java 的数据库连接模板:JDBCTemplate》中 “2.2 新建实体类” 里的实体,可使用以下代码来实现。

@Data
@Entity
public class User {
	private int id;
	@Id
	// id 的自增由数据库自动管理
	@GeneratedValue(strategy = GenerationType.IDENTITY)
	private String username;
	private String password;
}

对比 JPA 与 JDBCTemplate 创建实体的方式可以看出:JPA 的实现方式简单明了,不需要写映射(支持自定义映射),只需要设置好属性即可。id 的自增由数据库自动管理,也可以由程序管理,其他的工作 JPA 自动处理好了。

3.使用 JPA

要使用 JPA,只要加入它的 Starter 依赖,然后配置数据库连接信息。

3.1 添加 JPA 和 MySQL 数据库的依赖

下面以配置 JPA 和 MySQL 数据库的依赖为例,具体配置见以下代码:

<dependency>
	<groupId>org.springframework.boot</groupId>
	<artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>

<dependency>
	<groupId>mysql</groupId>
	<artifactId>mysql-connector-java</artifactId>
	<scope>runtime</scope>
</dependency>

3.2 配置数据库连接信息

Spring Boot 项目使用 MySQL 等关系型数据库,需要配置连接信息,可以在 application.properties 文件中进行配置。以下代码配置了与 MySQL 数据库的连接信息:

spring.datasource.url=jdbc:mysql://127.0.0.1/book?useUnicode=true&characterEncoding=utf-8&serverTimezone=UTC&useSSL=true
spring.datasource.username=root
spring.datasource.password=root
spring.datasource.driver-class-name=com.mysql.jdbc.Driver
spring.jpa.properties.hibernate.hbm2ddl.auto=update
spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.MySQL5InnoDBDialect
spring.jpa.show-sql= true
  • spring.datasource.username:要填写的数据库用户名。
  • spring.datasource.password:要填写的数据库密码。
  • spring.jpa.show-sql:开发工具的控制台是否显示 SQL语句,建议打开。
  • spring.jpa.properties.hibernate.hbm2ddl.auto:hibernate 的配置属性,其主要作用是自动创建、更新、验证数据库表结构。该参数的几种配置如下表所示。
属性
说明
create每次加载 Hibernate 时都会删除上一次生成的表,然后根据 Model 类再重新生成新表,哪怕没有任何改变也会这样执行,这会导致数据库数据的丢失。
create-drop每次加载 Hibernate 时会根据 Model 类生成表,但是 sessionFactory 一旦关闭,表就会自动被删除。
update最常用的属性。第一次加载 Hibernate 时会根据 Model 类自动建立表的结构(前提是先建立好数据库)。以后加载 Hibernate 时,会根据 Model 类自动更新表结构,即使表结构改变了,但表中的数据仍然存在,不会被删除。要注意的是,当部署到服务器后,表结构是不会被马上建立起来的,要等应用程序第一次运行起来后才会建立。Update 表示如果 Entity 实体的字段发生了变化,那么直接在数据库中进行更新。
validate每次加载 Hibernate 时,会验证数据库的表结构,只会和数据库中的表进行比较,不会创建新表,但是会插入新值。

4.了解 JPA 注解和属性

4.1 常用注解

注解
说明
@Entity声明类为实体
@Table声明表名,@Entity 和 @Table 注解一般一块使用,如果表名和实体类名相同,那么 @Table 可以省略
@Basic指定非约束明确的各个字段
@Embedded用于注释属性,表示该属性的类是嵌入类(@embeddable 用于注释 Java 类的,表示类是嵌入类)
@Id指定的类的属性,一个表中的主键
@GeneratedValue指定如何标识属性可以被初始化,如 @GeneratedValue(strategy=GenerationType.SEQUENCE, generator="repair_seq"),表示主键生成策略是 sequence,还有 Auto、Identity、Native 等
@Transient表示该属性并非一个数据库表的字段的映射,ORM 框架将忽略该属性。如果一个属性并非数据库表的字段映射,就务必将其标示为 @Transient,即它是不持久的,为虚拟字段
@Column指定持久属性,即字段名。如果字段名与列名相同,则可以省略。使用方法,如 @Column(length=11, name="phone", nullable=false, columnDefinition="varchar(11) unique comment '电话号码'")
@SequenceGenerator指定在 @GeneratedValue 注解中指定的属性的值。它创建一个序列
@TableGenerator在数据库生成一张表来管理主键生成策略
@AccessType这种类型的注释用于设置访问类型。如果设置 @AccessType(FIELD),则可以直接访问变量,并且不需要使用 Getter 和 Setter 方法,但必须为 public 属性。如果设置 @AccessType(PROPERTY),则通过 Getter 和 Setter 方法访问 Entity 的变量
@UniqueConstraint指定的字段和用于主要或辅助表的唯一约束
@ColumnResult可以参考使用 select 子句的 SQL 查询中的列名
@NamedQueries指定命名查询的列表
@NamedQuery指定使用静态名称的查询
@Basic指定实体属性的加载方式,如 @Basic(fetch=FetchType.LAZY)
@Jsonignore作用是 JSON 序列化时将 Java Bean 中的一些属性忽略掉,序列化和反序列化都受影响

4.2 映射关系的注解

注解
说明
@JoinColumn指定一个实体组织或实体集合。用在 多对一一对多 的关联中
@OneToOne定义表之间 一对一 的关系
@OneToMany定义表之间 一对多 的关系
@ManyToOne定义表之间 多对一 的关系
@ManyToMany定义表之间 多对多 的关系

4.3 映射关系的属性

属性名
说明
targetEntity表示默认关联的实体类型,默认为当前标注的实体类。
cascade表示与此实体一对一关联的实体的级联样式类型,以及当对实体进行操作时的策略。在定义关系时经常会涉及是否定义 Cascade(级联处理)属性,如果担心级联处理容易造成负面影响,则可以不定义。它的类型包括 CascadeType.PERSIST(级联新建)、CascadeType.REMOVE(级联删除)、CascadeType.REFRESH(级联刷新)、CascadeType.MERGE(级联更新)、CascadeType.ALL(级联新建、更新、删除、刷新)。
fetch该实体的加载方式,包含 LAZY 和 EAGER。
optional表示关联的实体是否能够存在 null 值。默认为 true,表示可以存在 null 值。如果为 false,则要同时配合使用 @JoinColumn 标记。
mappedBy双向关联实体时使用,标注在不保存关系的实体中。
JoinColumn关联指定列。该属性值可接收多个 @JoinColumn。用于配置连接表中外键列的信息。@JoinColumn 配置的外键列参照当前实体对应表的主键列。
JoinTable两张表通过中间的关联表建立联系时使用,即多对多关系。
PrimaryKeyJoinColumn主键关联。在关联的两个实体中直接使用注解 @PrimaryKeyJoinColumn 注释。

懒加载 LAZY 和实时加载 EAGER 的目的是,实现关联数据的选择性加载。

  • 懒加载 是一种延迟加载策略,即在真正需要访问对象的属性时,才从数据库中加载数据。当 Hibernate 在查询数据库时遇到关联对象(如一对多、多对一、多对多等关系),并不会立即加载关联对象的数据,而只会加载主键 ID。只有当程序真正需要访问关联对象的属性时,Hibernate 才会发出 SQL 语句去加载数据。这种策略的优点在于,如果程序并不需要访问关联对象的所有属性,那么就可以节省数据库访问的开销,提高程序性能。但是,如果在使用懒加载的对象后关闭了 Session,那么在访问其关联对象的属性时,就会抛出 LazyInitializationException 异常,因为 Hibernate 需要在 Session 的作用范围内才能发出 SQL 语句加载数据。
  • 实时加载 是一种积极加载策略,即在加载一个对象时,会立即加载与其关联的所有对象。当 Hibernate 在查询数据库时遇到关联对象,会立即发出 SQL 语句加载关联对象的数据,并将其全部加载到内存中。这种策略的优点在于,程序可以随时访问关联对象的属性,而无需担心 Session 是否已经关闭。但是,如果关联对象的数据量很大,那么就会消耗大量的内存,并可能导致性能下降。

在 Spring Data JPA 中,要控制 Session 的生命周期,否则会出现 could not initialize proxy [xxxx#18] - no Session 错误。可以在配置文件中配置以下代码来控制 Session 的生命周期:

spring.jpa.open-in-view=true
spring.jpa.properties.hibernate.enable_lazy_load_no_trans=true

5.用 JPA 构建实体数据表

下面通过实例来体验如何通过 JPA 构建对象/关系映射的实体模型。

package com.example.demo.entity;

import lombok.Data;

import javax.persistence.*;
import javax.validation.constraints.NotEmpty;
import javax.validation.constraints.Size;
import java.io.Serializable;
import java.util.Arrays;
import java.util.List;

@Entity
@Data
public class Article implements Serializable {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private long id;

    @Column(nullable = false, unique = true)
    @NotEmpty(message = "标题不能为空")
    private String title;

    @Column(columnDefinition = "enum('图','图文','文')")
    private String type;

    private Boolean available = Boolean.FALSE;
    @Size(min = 0, max = 20)
    private String keyword;
    @Size(max = 255)
    private String description;
    @Column(nullable = false)
    private String body;

    @Transient
    private List keywordlists;

    public List getKeywordlists() {
        return Arrays.asList(this.keyword.trim().split("|"));
    }

    public void setKeywordlists(List keywordlists) {
        this.keywordlists = keywordlists;
    }
}

如果想创建虚拟字段,则通过在属性上加注解 @Transient 来解决。

运行项目后会自动生成数据表。完成后的数据表如下图所示。

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/760527.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

VMware虚拟机迁移:兼用性踩坑和复盘

文章目录 方法失败情况分析&#xff1a;参考文档 方法 虚拟机关机&#xff0c;整个文件夹压缩后拷贝到新机器中&#xff0c;开机启用即可 成功的情况&#xff1a; Mac (intel i5) -> Mac (intel i7)Mac (intel, MacOS - VMware Fusion) -> DELL (intel, Windows - VMw…

flask的基本使用2

上一篇我们介绍了基本使用方法 flask使用 【 1 】基本使用 from flask import Flask# 1 实例化得到对象 app Flask(__name__)# 2 注册路由--》写视图函数 app.route(/) def index():# 3 返回给前端字符串return hello worldif __name__ __main__:# 运行app&#xff0c;默认…

Linux【环境 CenOS7】部分软件安装链接整理

优质博文&#xff1a;IT-BLOG-CN 一、开启网络 【问题】&#xff1a; 刚安装完CentOS&#xff0c;当ping www.baidu.com时&#xff0c;ping不通&#xff1b; 【解决】&#xff1a; 进入cd /etc/sysconfig/network-scripts/我这里修改的是ifcfg-ens33文件&#xff0c;将ONBOOT…

论文阅读_基于嵌入的Facebook搜索

英文名称&#xff1a;Embedding-based Retrieval in Facebook Search 中文名称&#xff1a;基于嵌入式检索的Facebook搜索 时间&#xff1a;Wed, 29 Jul 2020 (v2) 地址&#xff1a;https://arxiv.org/abs/2006.11632 作者&#xff1a;Jui-Ting Huang, Ashish Sharma, Shuying …

【计算机网络仿真】b站湖科大教书匠思科Packet Tracer——实验12 默认路由和特定主机路由

一、实验目的 1.验证默认路由和特定主机路由的作用&#xff1b; 二、实验要求 1.使用Cisco Packet Tracer仿真平台&#xff1b; 2.观看B站湖科大教书匠仿真实验视频&#xff0c;完成对应实验。 三、实验内容 1.构建网络拓扑&#xff1b; 2.验证验证默认路由和特定主机路由…

MySQL高级-索引-使用规则-SQL提示(use、ignore、force)

文章目录 1、查看表 tb_user2、展示索引3、为profession、age、status创建 联合索引4、查询 profession软件工程5、执行计划 profession软件工程6、创建profession单列索引7、再次执行计划 profession软件工程8、SQL提示8.1、use index(idx_user_pro)8.2、ignore index(idx_use…

九浅一深Jemalloc5.3.0 -- ①浅*编译调试

目前市面上有不少分析Jemalloc老版本的博文&#xff0c;但5.3.0却少之又少。而且5.3.0的架构与之前的版本也有较大不同&#xff0c;本着“与时俱进”、“由浅入深”的宗旨&#xff0c;我将逐步分析Jemalloc5.3.0的实现。5.3.0的特性请见Releases jemalloc/jemalloc GitHub 另…

dB分贝入门

主要参考资料&#xff1a; dB&#xff08;分贝&#xff09;定义及其应用: https://blog.csdn.net/u014162133/article/details/110388145 目录 dB的应用一、声音的大小二、信号强度三、增益 dB的应用 一、声音的大小 在日常生活中&#xff0c;住宅小区告知牌上面标示噪音要低…

实战精选 | 在NPU上运行BGE embedding模型,提升RAG整体性能

点击蓝字 关注我们,让开发变得更有趣 作者 | 杨亦诚 排版 | 李擎 介绍 BGE全称是BAAI General Embedding&#xff0c;即北京智源人工智能研究院通用Embedding模型&#xff0c;它可以将任意文本映射到低维的稠密向量&#xff0c;在文本向量化任务中得到了广泛的应用。可以看到在…

180Kg大载重多旋翼无人机技术详解

一、机体结构与材料 180Kg大载重多旋翼无人机在机体结构上采用了高强度轻量化设计。其主体框架采用航空铝合金材料&#xff0c;既保证了机体的结构强度&#xff0c;又减轻了整体重量。同时&#xff0c;关键部位如连接件、旋翼支撑臂等则采用碳纤维复合材料&#xff0c;以进一步…

独一无二的设计模式——单例模式(Java实现)

1. 引言 亲爱的读者们&#xff0c;欢迎来到我们的设计模式专题&#xff0c;今天的讲解的设计模式&#xff0c;还是单例模式哦&#xff01;上次讲解的单例模式是基于Python实现&#xff08;独一无二的设计模式——单例模式&#xff08;python实现&#xff09;&#xff09;的&am…

Django 对模型创建的两表插入数据

1&#xff0c;添加模型 Test/app8/models.py from django.db import modelsclass User(models.Model):username models.CharField(max_length50, uniqueTrue)email models.EmailField(uniqueTrue)password models.CharField(max_length128) # 使用哈希存储密码first_name …

无人机挂载抛弹吊舱技术详解

随着无人机技术的飞速发展&#xff0c;无人机在军事、安全、农业、环保等领域的应用越来越广泛。其中&#xff0c;挂载抛弹吊舱的无人机在精确打击、应急处置等场合发挥着重要作用。抛弹吊舱技术通过将弹药、物资等有效载荷挂载在无人机下方&#xff0c;实现了无人机的远程投放…

Linux源码阅读笔记07-进程管理4大常用API函数

find_get_pid find_get_pid(...)函数功能&#xff1a;根据进程编号获取对应的进程描述符&#xff0c;具体Linux内核源码对应函数设计如下&#xff1a; 获取进程描述符&#xff0c;且描述符的count1&#xff0c;表示进程多一个用户 pid_task pid_task(...)函数功能&#xff1…

《昇思25天学习打卡营第6天 | 函数式自动微分》

《昇思25天学习打卡营第6天 | 函数式自动微分》 目录 《昇思25天学习打卡营第6天 | 函数式自动微分》函数式自动微分简单的单层线性变换模型函数与计算图微分函数与梯度计算Stop Gradient 函数式自动微分 神经网络的训练主要使用反向传播算法&#xff0c;模型预测值&#xff0…

基于ssm口红商城管理的设计与实现

一、&#x1f468;‍&#x1f393;网站题目 口红商城项目可以提供更加便捷和高效的购物方式。消费者可以在家中使用电脑或手机随时随地购物&#xff0c;避免了传统购物方式中需要花费时间和精力去实体店铺购物的麻烦。此外&#xff0c;口红商城项目还提供了更多的选择和更低的…

JavaSE (Java基础):面向对象(上)

8 面向对象 面向对象编程的本质就是&#xff1a;以类的方法组织代码&#xff0c;以对象的组织&#xff08;封装&#xff09;数据。 8.1 方法的回顾 package com.oop.demo01;// Demo01 类 public class Demo01 {// main方法public static void main(String[] args) {int c 10…

2023年的Facebook营销:超级完整指南

Facebook营销不是可选的&#xff0c;是必须的。Facebook是世界上使用最多的社交平台&#xff0c;每天吸引22.9亿活跃用户。 它也不全是度假照片和虚张声势。对于53.2% 的 16-24 岁互联网用户&#xff0c;社交媒体是他们进行品牌研究的主要来源。而且&#xff0c;66% 的 Facebo…

GoSync+华为智能穿戴使用指导

GoSync官方简介&#xff1a; GoSync 是一款免费应用程序&#xff0c;主要用于将您的可穿戴设备中的步行、跑步、骑自行车和游泳等活动数据同步到您的 Google Fit 和其他健身平台。在开始同步数据之前&#xff0c;您需要将您的可穿戴设备账户与您的健身平台账户连接起来。在创建…

WEB攻防【5】——JS项目/Node.js框架安全/识别审计/验证绕过

1、test.php和test.html对比 #知识点&#xff1a; 1、原生JS&开发框架-安全条件 2、常见安全问题-前端验证&未授权 #详细点: 1、什么是Js渗透测试? 在Javascript中也存在变量和函数&#xff0c;当存在可控变量及函数调用即可参数漏洞 JS开发的WEB应用和PHP、java.NET…