jpa jql 时间范围查询_临近35岁中年危机的程序员思考什么是JPA?

bf6cfd2f24441e8a0022b04e38e73d12.png

简介

JPA是用于在关系数据库中存储,访问和管理Java对象的Java ORM标准。

作为规范,Java Persistence API关注持久性, 并非所有Java对象都需要持久化,但大多数应用程序都会保存关键业务对象。 JPA规范允许定义应该保存哪些对象,以及如何在Java应用程序中保存这些对象。

JPA本身不是一个工具或框架, 相反,它定义了一组可以由任何工具或框架实现的概念。 虽然JPA的对象关系映射(ORM)模型最初基于Hibernate,但它向前发展了。 同样,虽然JPA最初打算用于关系/ SQL数据库,但是一些JPA实现已经扩展用于NoSQL数据存储。 比如EclipseLink,作为JPA 2.2的参考实现,就同时支持JPA和NoSQL。

JPA和Hibernate

由于它们交织在一起的历史,Hibernate和JPA经常混为一谈。 但是,与Java Servlet规范一样,JPA产生了许多兼容的工具和框架; Hibernate只是其中之一。

Hibernate由Gavin King开发,于2002年初发布,是一个用于Java的ORM库。 King开发了Hibernate作为持久化实体bean的替代品。 该框架非常受欢迎,因此它的许多想法都在第一个JPA规范中被采用和编纂。

今天,Hibernate ORM是最成熟的JPA实现之一,并且仍然是Java中ORM的流行选项。 Hibernate ORM 5.3.8实现了JPA 2.2。 此外,Hibernate的工具系列已经扩展到包括Hibernate Search,Hibernate Validator和Hibernate OGM等流行工具,后者支持NoSQL的域模型持久性。

什么是Java ORM?

虽然它们的执行不同,但每个JPA实现都提供某种ORM层。为了理解JPA和JPA兼容的工具,我们要知道ORM。

作为应用程序体系结构的一部分,ORM层负责管理软件对象的转换,以便与关系数据库中的表和列进行交互。在Java中,ORM层转换Java类和对象,以便可以在关系数据库中进行存储和管理。

默认情况下,持久化对象的名称将成为表的名称,字段将成为列。设置表后,每个表行对应于应用程序中的对象。一般来说对象映射是可配置的,不过默认值往往效果很好。

Java中的数据持久性

从编程的角度来看,ORM层是一个适配器层:它使面向对象的开发语言适应SQL和关系表的语言。 ORM层允许面向对象的开发人员构建持久保存数据的软件,而无需离开面向对象这个概念。

使用JPA时,可以创建从数据存储区到应用程序的数据模型对象的映射。您可以定义对象和数据库之间的映射,而不是定义对象的保存和检索方式,然后调用JPA来保存它们。如果您正在使用关系数据库,那么应用程序代码和数据库之间的大部分实际连接将由JDBC处理。

作为规范,JPA提供元数据注解,您可以使用它来定义对象和数据库之间的映射。每个JPA实现都为JPA注解提供了自己的引擎。 JPA规范还提供了PersistanceManager或EntityManager,它们是与JPA系统联系的关键点(其中我们的业务逻辑代码告诉系统如何处理映射对象)。

为了看得更仔细,我们看看下面的代码,这是一个用于为音乐家建模的简单数据类。

a24fbff57b867b11f00feb0428f9bbc7.png

代码中的Musician类用于保存数据。 它可以包含原始数据,例如名称字段。 它还可以与其他类(如mainInstrument和performance)保持关系

Musician 这种类有时称为DTO或数据传输对象。 DTO是软件开发的常见功能。 虽然它们包含多种数据,但它们不包含任何业务逻辑。 持久化数据对象是软件开发中普遍存在的挑战。

JDBC的数据持久性

将Musician类的实例保存到关系数据库的一种方法是使用JDBC库。 JDBC是一个抽象层,它允许应用程序发出SQL命令而无需考虑底层数据库实现。

下面的代码显示了如何使用JDBC持久化Musician类。

3b7ecf143be559bbbe350a483eb3ff27.png

georgeHarrison对象可以来自任何地方(前端提交,外部服务等),并设置其ID和名称字段。 然后,对象上的字段用于提供SQL插入语句的值。 (PreparedStatement类是JDBC的一部分,提供了一种将值安全地应用于SQL查询的方法。)

虽然JDBC允许手动配置附带的控件,但与JPA相比,它很麻烦。 要修改数据库,首先需要创建一个SQL查询,该查询从Java对象映射到关系数据库中的表。 然后,只要对象签名发生更改,就必须修改SQL。 使用JDBC,维护SQL本身就成了一项任务。

JPA的数据持久性

现在看看下面的代码,我们使用JPA持久保存Musician类。

675aededb3c9f24df89b241b934c7a60.png

我们用一行session.save()替换了JDBC中的手动SQL,它指示JPA持久保存该对象。 从那时起,SQL转换由框架处理,因此我们永远不必离开面向对象。

JPA中的元数据注释

上面的代码中的魔力来自配置,该配置是使用JPA的注解创建的。 我们使用注解来告知JPA应该保留哪些对象,以及如何保留它们。

下面的代码显示了带有单个JPA注解的Musician类。

3326bba4a31d63e86e5b70c31d3b9a61.png

持久对象有时称为实体。 将@Entity附加到类似Musician的类可以告知JPA该类及其对象应该被保留。JPA还支持使用外部XML文件而不是注释来定义类元数据。

配置JPA

与大多数现代框架一样,JPA遵循约定编码(也称为约定优于配置),其中框架提供基于行业最佳实践的默认配置。 作为一个示例,名为Musician的类将默认映射到名为Musician的数据库表。

传统配置是节省时间的,并且在许多情况下它运行良好。 当然也可以自定义JPA配置。 例如,我们可以使用JPA的@Table注释来指定应存储音乐家类的表。

513c250cc9222626d6d134cc083436d7.png

上面的代码告诉JPA将实体(音乐家类)持久保存到音乐家表中。

主键

在JPA中,主键是用于唯一标识数据库中每个对象的字段。 主键可用于引用对象并将对象与其他实体相关联。 每当我们在表中存储对象时,我们还将指定要用作其主键的字段。

在下面的代码中,我们告诉JPA哪个字段用作Musician的主键。

0f5c686eec4523223c0b17ed11b12f34.png

在这种情况下,我们使用JPA的@Id注释将id字段指定为Musician的主键。 默认情况下,此配置假定主键将由数据库设置 - 例如,当字段设置为在表上自动递增时。

JPA支持生成对象主键的其他策略。 它还有用于更改单个字段名称的注释。 通常,JPA足够灵活,可以适应我们可能需要的任何持久性映射。

CRUD操作

将类映射到数据库表并建立其主键后,即可拥有在数据库中创建,检索,删除和更新该类所需的一切。 调用session.save()将创建或更新指定的类,具体取决于主键字段是否为null或是否适用于现有实体。 调用entityManager.remove()将删除指定的类。

JPA中的实体关系

简单地使用原始字段持久化对象只是方程式的一半。 JPA还具有管理彼此相关实体的能力。在表和对象中都有四种实体关系:

  • 一对多
  • 多对一
  • 多对多
  • 一对一 每种类型的关系描述了实体与其他实体的关系。例如,音乐家实体可以与Performance建立一对多关系,Performance是由List或Set等集合表示的实体。

定义关系类型

JPA为每种关系映射类型都有注释。 清单7显示了如何注释Musician和Performances之间的一对多关系。

b42f00958f3e77fe1152d717c2f1098a.png

需要注意的一点是@JoinColumn告诉JPA Performance表上的哪些列将映射到Musician实体。每个演奏都将与一位音乐家相关联,该音乐家将由此专栏进行跟踪。当JPA将Musician或Performance加载到数据库中时,它将使用此信息重新构建对象图。

获取策略

除了知道在数据库中放置相关实体的位置之外,JPA还需要知道如何加载它们。获取策略告诉JPA如何加载相关实体。加载和保存对象时,JPA框架必须能够微调对象图的处理方式。例如,如果Musician类有一个bandMate字段(如清单7所示),加载george可能会导致从数据库加载整个Musician表!

我们需要的是定义相关实体的延迟加载(Lazy)的能力 - 当然,认识到JPA中的关系可能是Eager或Lazy的。我们可以使用注解来自定义获取策略,但JPA的默认配置通常可以直接使用,无需更改。我们上面所说的4种实体类型的默认配置如下:

一对多:Lazy 多对一:Eager 多对多:Lazy 一对一:Eager

结论

处理数据库的每个应用程序都应该定义一个专有层,其唯一目的是隔离持久性代码。 正如我们在本文中看到的,Java Persistence API引入了一系列功能并支持Java对象持久性。 简单的应用程序可能不需要JPA的所有功能,在某些情况下,配置框架的开销可能不值得。 然而,随着应用程序的增长,JPA的结构和封装确实能够保持不变。 使用JPA可以简化目标代码,并提供用于访问Java应用程序中的数据的传统框架。

转发+转发+转发+私信关键词 【学习】 即可免费领取JAVA资料+面试文档!!!!!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值