JPA(Java Persistence Annotation)是 Java 的标准解决方案,用于弥合面向对象的领域模型和关系数据库系统之间的差距。这个想法是将 Java 类映射到关系表,并将这些类的属性映射到表中的行。通过在同一编程范式中无缝协作两种不同的技术,这改变了 Java 编码整体体验的语义。本文提供了一个概述及其在 Java 中的支持实现。
概述
关系数据库可能是计算中可用的所有持久性技术中最稳定的,而不是与之相关的所有复杂性。这是因为今天,即使在所谓的“大数据”时代,“NoSQL”关系数据库的需求量也一直在增长。关系数据库是稳定的技术,不仅仅是文字,而是它多年来的存在。NoSQL 可能适合处理企业中的大量结构化数据,但通过关系数据库更好地处理大量事务性工作负载。此外,还有一些与关系数据库相关的出色分析工具。
为了与关系数据库进行通信,ANSI 标准化了一种称为 SQL(结构化查询语言)的语言。用这种语言编写的语句可用于定义和操作数据。但是,SQL 处理 Java 的问题是它们的语法结构不匹配,并且在核心上非常不同,这意味着 SQL 是过程性的,而 Java 是面向对象的。因此,寻求一种可行的解决方案,使 Java 可以以面向对象的方式说话,并且关系数据库仍然能够相互理解。JPA 是该调用的答案,并提供了在两者之间建立工作解决方案的机制。
与对象映射相关
Java 程序通过使用 JDBC(Java 数据库连接)API 与关系数据库进行交互。JDBC 驱动程序是连接的关键,它允许 Java 程序使用 JDBC API 操作该数据库。建立连接后,Java 程序以字符串的形式触发 SQL 查询,以传达创建、插入、更新和删除操作。这对于所有实际目的都足够了,但从 Java 程序员的角度来看是不方便的。如果可以将关系表的结构改造成纯 Java 类,然后你可以以通常的面向对象的方式处理它们会怎样? 关系表的结构是以表格形式对数据进行逻辑表示。表由描述实体属性的列组成,行是实体的集合。
根据 Java Persistence 2.1 规范,JPA 增加了对模式生成、类型转换方法、在查询和查找操作中使用实体图、不同步的持久性上下文、存储过程调用以及注入实体侦听器类的支持。它还包括对 Java Persistence 查询语言、Criteria API 和本机查询映射的增强。
简而言之,它尽一切努力提供一种错觉,即在处理关系数据库时没有过程部分,一切都是面向对象的。
JPA 实施
JPA 描述了 Java 应用程序中的关系数据管理。它是一个规范,并且有许多实现。一些流行的实现是 Hibernate、EclipseLink 和 Apache OpenJPA。JPA 通过 Java 类中的注释或 XML 配置文件定义元数据。但是,我们可以同时使用 XML 和注释来描述元数据。在这种情况下,XML 配置会覆盖注释。这是合理的,因为注解是用 Java 代码编写的,而 XML 配置文件是 Java 代码的外部文件。因此,以后需要对元数据进行更改(如果有的话);在基于注解的配置的情况下,它需要直接访问 Java 代码。这可能总是不可能的。在这种情况下,我们可以在 XML 文件中编写新的或更改的元数据配置,而无需对原始代码进行任何更改,并且仍然具有预期的效果。这是使用 XML 配置的优势。但是,基于注解的配置使用起来更方便,是程序员的流行选择。
由于 Red Hat,Hibernate 是所有 JPA 实现中最流行和最先进的。除了 JPA 实现之外,它还使用自己的调整和附加功能。它拥有更大的用户社区,并且有据可查。一些额外的专有功能是支持多租户、在查询中加入不关联的实体、时间戳管理等。
EclipseLink 基于 TopLink,是 JPA 版本的参考实现。除了一些有趣的专有特性(例如多租户支持、数据库更改事件处理等)之外,它还提供标准 JPA 功能。
结论
JPA 和持久性上下文的核心术语比这里说的要广泛,但是从快速概述开始比冗长的复杂脏代码及其概念细节要好。如果你在核心 JDBC 方面有一点编程经验,那么你无疑会欣赏 JPA 如何让你的编码生活变得更简单。