jpa query 取数组第一个_什么是JPA?Java Persistence API简介

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

894d3469462ec949dc186f97a69e4370.png

Java持久性系列

  • 什么是JPA?Java入门...
  • 什么是JDBC?Java入门...
  • Java持久性与JPA和...
  • Java持久性与JPA和...
  • JPA和...中的继承关系

显示更多

作为规范,Java Persistence API与persistence有关,它宽松地表示Java对象在创建它们的应用程序进程中不存在的任何机制。并非所有Java对象都需要持久化,但是大多数应用程序都可以持久化关键业务对象。JPA规范使您可以定义应保留哪些对象,以及应如何在Java应用程序中保留这些对象。

JPA本身不是工具或框架;相反,它定义了可以由任何工具或框架实施的一组概念。尽管JPA的对象关系映射(ORM)模型最初是基于Hibernate的,但此后一直在发展。同样,尽管JPA最初旨在与关系/ SQL数据库一起使用,但某些JPA实现已扩展为与NoSQL数据存储一起使用。EclipseLink是支持JPA和NoSQL的流行框架,它是JPA 2.2的参考实现。

Jarkata EE中的JPA 2.2

Java Persistence API作为Java EE 5中EJB 3.0规范(JSR 220)的子集首次发布,从Java EE 6(JSR 317)中的JPA 2.0发布开始,它就发展成为自己的规范。在撰写本文时,JPA 2.2已作为Jakarta EE的一部分被采用作为延续。

JPA和Hibernate

由于它们的历史交织在一起,Hibernate和JPA经常合并在一起。但是,就像Java Servlet规范一样,JPA产生了许多兼容的工具和框架。休眠只是其中之一。

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的域模型持久性。

JPA和EJB

如前所述,JPA是作为EJB 3.0的子集引入的,但此后又演变为自己的规范。EJB是一个与JPA重点不同的规范,并且是在EJB容器中实现的。每个EJB容器都包含一个持久层,由JPA规范定义。

什么是Java ORM?

尽管它们的执行有所不同,但是每个JPA实现都提供某种ORM层。为了了解JPA和与JPA兼容的工具,您需要对ORM有很好的了解。

对象关系映射是一项任务 -开发人员有充分的理由避免手动执行此任务。诸如Hibernate ORM或EclipseLink之类的框架将该任务编码为一个库或框架,即ORM层。作为应用程序体系结构的一部分,ORM层负责管理软件对象的转换,以与关系数据库中的表和列进行交互。在Java中,ORM层转换Java类和对象,以便可以在关系数据库中存储和管理它们。

[ 在这个由12部分组成的综合课程中,从入门概念到高级设计模式学习Java!]

默认情况下,要保留的对象的名称将成为表的名称,而字段将成为列。一旦建立了表,每个表行都对应于应用程序中的一个对象。对象映射是可配置的,但是默认设置通常可以正常工作。

JPA与NoSQL

直到最近,非关系型数据库还是鲜为人知的问题。NoSQL运动改变了这一切,现在Java开发人员可以使用各种NoSQL数据库。一些JPA实现已发展为包含NoSQL,包括Hibernate OGM和EclipseLink。

图1说明了JPA和ORM层在应用程序开发中的作用。

488721569cb97ae2d1bc4509145ca938.png

图1. JPA和ORM层

配置Java ORM层

设置新项目以使用JPA时,将需要配置数据存储和JPA提供程序。您将配置一个数据存储连接器以连接到您选择的数据库(SQL或NoSQL)。您还将包括并配置JPA提供程序,它是Hibernate或EclipseLink之类的框架。尽管您可以手动配置JPA,但许多开发人员选择使用Spring的即用型支持。有关手动和基于Spring的JPA安装和设置的演示,请参见下面的“ JPA安装和设置 ”。

Java数据对象

Java Data Objects是一个标准化的持久性框架,它与JPA的不同之处主要在于,它支持对象中的持久性逻辑,以及其长期支持使用非关系数据存储。JPA和JDO非常相似,因此JDO提供程序经常也支持JPA。请参阅Apache JDO项目,以了解有关JDO与其他持久性标准(如JPA和JDBC)的更多信息。

Java中的数据持久性

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

使用JPA时,您将创建一个从数据存储到应用程序的数据模型对象的映射。您无需定义对象的保存和检索方式,而是定义对象与数据库之间的映射,然后调用JPA来持久化它们。如果您使用的是关系数据库,则应用程序代码与数据库之间的大部分实际连接将由JDBC(Java数据库连接API)处理。

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

为了使所有这些更加具体,请考虑清单1,它是用于建模音乐家的简单数据类。

清单1. Java中的一个简单数据类
public class Musician {  private Long id;  private String name;  private Instrument mainInstrument;  private ArrayList performances = new ArrayList();  public Musician( Long id, String name){ /* constructor setters... */ }  public void setName(String name){    this.name = name;  }  public String getName(){    return this.name;  }  public void setMainInstrument(Instrument instr){    this.instrument = instr;  }  public Instrument getMainInstrument(){    return this.instrument;  }  // ...Other getters and setters...}

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

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

JDBC的数据持久性

将Musician类的实例保存到关系数据库的一种方法是使用JDBC库。JDBC是抽象层,它使应用程序可以在不考虑基础数据库实现的情况下发出SQL命令。

清单2显示了如何Musician使用JDBC 持久化该类。

清单2. JDBC插入记录
Musician georgeHarrison = new Musician(0, "George Harrison");    String myDriver = "org.gjt.mm.mysql.Driver";      String myUrl = "jdbc:mysql://localhost/test";      Class.forName(myDriver);      Connection conn = DriverManager.getConnection(myUrl, "root", "");      String query = " insert into users (id, name) values (?, ?)";      PreparedStatement preparedStmt = conn.prepareStatement(query);      preparedStmt.setInt    (1, 0);      preparedStmt.setString (2, "George Harrison");      preparedStmt.setString (2, "Rubble");      preparedStmt.execute();      conn.close();// Error handling removed for brevity

清单2中的代码是完全自我记录的。该georgeHarrison对象可以来自任何地方(前端提交,外部服务等),并且已设置其ID和名称字段。然后,对象上的字段用于提供SQL insert语句的值。(PreparedStatement该类是JDBC的一部分,提供了一种将值安全地应用于SQL查询的方法。)

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

使用JPA的数据持久性

现在考虑清单3,在这里Musician使用JPA 持久化该类。

清单3.坚持使用JPA的George Harrison
Musician georgeHarrison = new Musician(0, "George Harrison");musicianManager.save(georgeHarrison);

清单3用单行替换清单2中的手动SQL session.save(),它指示JPA持久化对象。从那时起,SQL转换由框架处理,因此您不必离开面向对象的范例。

JPA中的元数据注释

清单3中的神奇之处是配置的结果,该配置是使用JPA的注释创建的。开发人员使用批注来通知JPA哪些对象应该保留,以及它们应该如何保留。

清单4显示了Musician带有单个JPA批注的类。

清单4. JPA的@Entity批注
@Entitypublic class Musician {  // ..class body}

持久性对象有时称为实体。附加@Entity到这样的类将Musician通知JPA该类及其对象应保留。

XML与基于注释的配置

JPA还支持使用外部XML文件而不是注释来定义类元数据。但是,为什么要自己动手呢?

配置JPA

像大多数现代框架一样,JPA包含按约定编码(也称为配置约定),其中该框架根据行业最佳实践提供默认配置。作为一个示例,Musician默认情况下将将名为的类映射到名为Musician的数据库表。

常规配置是节省时间的,并且在许多情况下它运行良好。还可以定制您的JPA配置。例如,您可以使用JPA的@Table批注指定Musician应在其中存储类的表。

清单5. JPA的@Table批注
@Entity@Table(name="musician")public class Musician {  // ..class body}

清单5告诉JPA将实体(Musician类)持久化到musician表中。

首要的关键

在JPA中,主键是用于唯一标识数据库中每个对象的字段。主键对于将对象引用和关联到其他实体很有用。每当将对象存储在表中时,您还将指定要用作其主键的字段。

在清单6中,我们告诉JPA哪个字段用作Musician的主键。

清单6.指定主键

@Entitypublic class Musician {   @Id   private Long id;

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

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

CRUD操作

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

JPA中的实体关系

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

    1. 一对多
    2. 多对一
    3. 多对多
    4. 一对一

每种关系类型都描述一个实体与其他实体的关系。例如,Musician实体可以与,或以集合表示的实体具有一对多关系。PerformanceListSet

如果Musician包含Band字段,则这些实体之间的关系可能是多对一的,这意味着Musician在单个Band类上集合。(假设每个音乐家只在一个乐队中表演。)

如果Musician包含一个BandMates字段,则可能表示与其他实体的多对多关系Musician。

最后,Musician可能与实体具有一对一的关系Quote,用于表示一个著名的报价:Quote famousQuote = new Quote()。

定义关系类型

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

清单7.注释一对多关系

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值