首页
学习
活动
专区
工具
TVP
发布

如何来实现SpringBoot应用的JPA数据持久化和热插拔

数据持久化

JPA ( Java Persistence API)是用于管理Java EE和Java SE环境中的持久化,以及对象/关系映射的Java API。

JPA最新规范为“JSR 338: Java Persistence 2.1”( htps:/cp.org/e/e/ail?id=338)。目前,市面上实现该规范的常见JPA框架有EclipseLink ( ht://www.eclipse.org/ecipselink)、Hibermate( ht:t:hib/mate.or/orom )、Apache OpenJPA ( htp://penipapache.org/)等。

本文主要介绍以Hibernate为实现的JPA。

JPA的产生背景

在JPA产生之前,围绕如何简化数据库操作的相关讨论已经是层出不穷,众多厂商和开源社区也都提供了持久层框架的实现,其中ORM框架最为开发人员所关注。

ORM ( Object Relational Mapping,对象关系映射)是-一种用于实现面向对象编程语言里不同类型系统的数据之间转换的程序技术。由于面向对象数据库系统( OODBS)的实现在技术上还存在难点,目前,市面上流行的数据库还是以关系型数据库为主。

由于关系型数据库使用的SQL语言是一-种非过程化的面向集合的语言,而目前许多应用仍然是由高级程序设计语言( 如Java)来实现的,但是高级程序设计语言是过程化的,而且是面向单个数据的,这使得SQL与它之间存在着不匹配,这种不匹配称为“阻抗失配”。由于“阻抗失配”的存在,使得开发人员在使用关系型数据库时不得不花很多功夫去完成两种语言之间的相互转化。

而ORM框架的产生,正是为了简化这种转化操作。在编程语言中,使用ORM就可以使用面向对象的方式来完成数据库的操作。

ORM框架的出现,使直接存储对象成为可能,它们将对象拆分成SQL语句,从而来操作数据库。但是不同的ORM框架,在使用上存在比较大的差异,这也导致开发人员需要学习各种不同的ORM框架,增加了技术学习的成本。

而JAP规范就是为了解决这个问题:规范ORM框架,使用ORM框架统- -的接口 和用法。这样在采用面向接口编程的技术中,即便更换了不同的ORM框架,也无须变更业务逻辑。

最早的JPA规范是由Java官方提出的,随JavaEE5规范一同发布。

实体( Entity )

实体是轻量级的持久化域对象。通常,实体表示关系数据库中的表,并且每个实体实例对应于该表中的行。实体的主要编程工件是实体类,尽管实体可以使用辅助类。

在EJB3之前,EJB 主要包含三种类型:会话bean、消息驱动bean、实体bean。但自EJB 3.0开始,实体bean被单独分离出来,形成了新的规范: JPA。所以,JPA完全可以脱离EJB 3来使用。实体是JPA中的核心概念。

实体的持久状态通过持久化字段或持久化属性来表示。这些字段或属性使用对象/关系映射注解将实体和实体关系映射到基础数据存储中的关系数据。

与实体在概念上比较接近的另外一个领域对象是值对象。实体是可以被跟踪的,通常会有一个主键(唯一标识)来追踪其状态。而值对象则没有这种标识,我们只关心值对象的属性。

Spring Data JPA概述

Spring Data JPA是更大的Spring Data家族的一部分,使得轻松实现基于JPA的存储库变得更容易。该模块用于处理对基于JPA的数据访问层的增强支持。它使更容易构建基于使用Spring数据访问技术栈的应用程序。

Spring Data JPA对于JPA的支持则是更近-步。使用Spring Data JPA,开发者无须过多关注EntityManager的创建、事务处理等JPA相关的处理,这基本上也是作为一个 开发框架而言所能做到的极限了,甚至Spring Data JPA让你连实现持久层业务逻辑的工作都省了,唯-要做的,就只是声明持久层的接口,其他都交给Spring Data JPA来帮你完成。

Spring Data JPA就是这么强大,让你的数据持久层开发工作简化,只需声明一个接口。比如,你声明了一个findUserBylId0,Spring Data JPA就能判断出这是根据给定条件的ID查询出满足条件的User对象,而其中的实现过程开发者无须关心,这一-切都交予Spring Data JPA来完成。

对于普通开发者而言,自己实现应用程序的数据访问层是一件极 其繁琐的过程。开发者必须编写太多的样板代码来执行简单查询、分页和审计。Spring Data JPA旨在通过将努力减少到实际需要的量来显著改进数据访问层的实现。作为开发人员,只需要编写存储库的接口,包括自定义查询方法,而这些接口的实现,Spring Data JPA将会自动提供。

Spring Data JPA包含如下特征。

●基于Spring和JPA来构建复杂的存储库。

支持Querydsl ( htp://ww.querydsl.com)谓词,因此支持类型安全的JPA查询。

域类的透明审计。

具备分页支持、动态查询执行、集成自定义数据访问代码的能力。

在引导时验证带@Query注解的查询。

●支持基于XML的实体映射。

通过引入@EnableJpaRepositories来实现基于JavaConfig的存储库配置。

如何使用Spring Data JPA

在项目中使用spring- data-jpa的推荐方法是使用依赖关系管理系统。下 面是使用Gradle构建的示例。

在代码中,我们只需声明继承自Spring Data JPA中的接口。

在这个例子中,代码继承自Spring Data JPA中的JpaRepository接口,而后声明相关的方法即可。比如声明findByNameLike,就能自动实现通过名称来模糊查询的方法。

Spring Data JPA的核心概念

SpringData存储库抽象中的中央接口是Repository。它将域类及域类的ID类型作为类型参数进行管理。此接口主要作为标记接口捕获要使用的类型,并帮助发现扩展此接口。而CrudReposi-tory为受管理的实体类提供复杂的CRUD功能。

CrudRepository接口中的方法含义如下。

(1)保存给定实体。

(2)返回由给定ID标识的实体。

(3)返回所有实体。

(4)返回实体的数量。

(5)删除给定的实体。

(6)指示是否存在具有给定ID的实体。

同时还提供其他特定的持久化技术的抽象,比如JpaRepository或MongoRepository,这些接口扩展了CrudRepository。

在CrudRepository的顶部有一个PagingAndSortingRepository 抽象,它增加了额外的方法来简化对实体的分页访问。

实现热插拔

对于Java项目而言,在开发过程中,一个非常大的问题在于,每次在修改完文件之后都需要重新编译、启动,才能查看到最新的修改效果,这极大影响了开发效率。因此, Spring Boot提供了几种热插拔( Hot Swapping)方式。本节主要介绍如何来实现Spring Boot应用的热插拔。

重新加载静态内容

有多种热加载的方式,推荐的方法是使用spring-boot-devtools,因为它提供了额外的功能,例如,支持快速应用程序重启和LiveReload及智能的开发时配置(如模板缓存)。

以下是在Maven添加Devtools的方式。

在Gradle添加Devtools则更加多简洁。

Devtools通过监视类路径的变更来实现热加载。这意味着静态资源更改必须构建才能使更改生效。不同的IDE触发更新的方式有所不同。默认情况下,在Eclipse中,保存修改的文件将导致类路径被更新并触发重新启动。在IntelliJ IDEA中,构建项目( Build -Make Project )将具有相同的效果。

在IDE中运行(特别是调试)是另外-一个非常好的开发方式,因为几乎所有现代IDE都允许重新加载静态资源,通常还可以热部署Java类的更改。

LiveReload

spring- boot- devtools模块包括一个嵌入式LiveReload 服务器,可以在资源更改时用于触发浏览器刷新。ht/iv/reload.com/excensions/ 网站为Chrome、Firefox 和Safari等免费提供了LiveReload浏览器的扩展程序。

需要注意的是,一次只能运行一个LiveReload服务器。应用程序启动之前,请确保没有其他LiveReload服务器正在运行。如果从IDE启动多个应用程序,则只有第一个应用程序将 支持LiveReload。

重新加载模板

Spring Boot在大多数模板技术中,都有包括禁用缓存的配置选项。启用这个禁用缓存的选项后,修改模板文件,就能自动实现模板的加载。如果使用spring -boot-devtools模块,这些属性将在开发时自动配置上。

下面是常用模板的禁用缓存的设置。

( 1 ) Thymeleaf

( 2 ) FreeMarker

如果使用FreeMarker,请设置springfreemarker.cache为false。

(3) Groovy

应用程序快速重启

spring-boot-devtools模块支持应用程序自动重新启动。虽然并不像商业软件JRebel那样快,但通常比“冷启动”快得多。所以,如果不想花费太多资源在这些商业软件身上,不妨尝试下Devtools。

重新加载Java类而不重新启动容器

现代IDE (如Eclipse、IDEA 等)都支持字节码的热插拔,所以如果进行了不影响类或方法签名的更改,那么应重新加载Java类,而不是重启容器,这样会更快、更干净,而且不会因为重启容器而产生副作用。

本文给大家介绍的内容是以Hibernate为实现的JPA,如何来实现SpringBoot应用的热插拔

1.觉得文章不错的小伙伴,可以转发关注小编一下;

2.下篇文章给大家介绍微服务测试这一块儿的内容;

3.感谢大家支持!!!!

  • 发表于:
  • 原文链接https://kuaibao.qq.com/s/20201013A0I4XJ00?refer=cp_1026
  • 腾讯「腾讯云开发者社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 cloudcommunity@tencent.com 删除。

扫码

添加站长 进交流群

领取专属 10元无门槛券

私享最新 技术干货

扫码加入开发者社群
领券