在本教程中,我们学习 EclipseLink 的基础。 在示例中,我们使用 Derby 和 Spring Boot。 这些项目是使用 NetBeans 构建的。
EclipseLink
EclipseLink 是来自 Eclipse Foundation 的开源 Eclipse Persistence Services 项目。 该软件提供了一个可扩展的框架,该框架允许 Java 开发人员与各种数据服务进行交互,包括数据库,Web 服务,对象 XML 映射和企业信息系统。 EclipseLink 基于 TopLink 产品,Oracle 从该产品中贡献了源代码来创建 EclipseLink 项目。 EclipseLink 是 Java Persistence API 的参考实现。
Java 持久性 API (JPA) 是 Java 应用编程接口规范,它描述了使用 Java 的应用中关系数据的管理。 Java 持久性查询语言(JPQL) 是独立于平台的面向对象的查询语言。 它是 JPA 规范的一部分。 JPQL 用于对关系数据库中存储的实体进行查询。 它在很大程度上受到 SQL 的启发,其查询在语法上类似于 SQL 查询,但是针对 JPA 实体对象而不是直接针对数据库表进行操作。
实体是 Java 类,将与 JPA 保持在一起。 它必须用javax.persistence.Entity
注释修饰。 此外,它必须具有@Id
注解和@GeneratedValue
,注解定义实体的主键的唯一 ID,该@GeneratedValue
定义生成主键的策略。 @Table
注解指定实体映射到的数据库表。
persistence.xml
是 JPA 中的标准配置文件。 它必须包含在包含实体 bean 的 JAR 文件内的META-INF
目录中。 在此文件中,我们定义了持久性单元,这些持久性单元定义了由应用中的实体管理器实例管理的所有实体类的集合。 EntityManager 是管理实体的持久状态的类。
EclipseLink 读取数据
第一个示例是 Java 命令行程序,该程序从Cars
表中检索所有行。 我们创建一个新的 NetBeans Java Maven 项目。
pom.xml
在pom.xml
文件中,我们定义了两个依赖项:eclipselink
和derbyclient
。
Figure: Creating persistence.xml file
要创建persistence.xml
,请在项目文件上单击鼠标右键,选择“新建—其他”,然后选择“持久性”类别。 有一个持久性单元选项。
persistence.xml
在persistence.xml
文件中,我们定义了一个名为cars-pu
的持久性单元。 我们定义一个持久性提供程序,它是一个 Derby 数据库。
设置此属性后,EclipseLink 将删除并创建数据库表。 Cars
表是从提供的元数据创建的。
在这里,我们指定 SQL 文件,该文件将数据填充到表中。
Figure: The persistence.xml file
persistence.xml
文件位于META-INF
子目录中
data.sql
这是用八行填充Cars
表的 SQL。
Car.java
这是我们的实体类。 它用@Entity
注释修饰。
@Table
注解引用 Derby 数据库中的Cars
表。
DBClient.java
这是一个 Java 控制台应用,它在实体管理器的帮助下从Cars
表中检索所有行。
在 JEE 容器之外使用 EclipseLink 之类的 JPA 提供程序时,我们必须通过EntityManagerFactory
创建一个实体管理器。 使用持久性单元名称作为参数,通过Persistence.createEntityManagerFactory()
方法创建工厂。
从EntityManagerFactory
中,我们使用createEntityManager()
方法创建一个EntityManager
。 创建的EntityManager
是应用管理的实体管理器。
看起来像 SQL 代码,但不是。 它是 Java 持久性查询语言(JPQL)语句的示例。 它从数据库表返回所有Car
实体。
使用createQuery()
方法创建Query
对象。
从查询对象中,我们获得Car
对象的列表。
对于由应用管理的实体管理器,我们必须显式关闭资源。
启动 Derby,构建应用并执行它之后,我们得到此输出。
EclipseLink 保存新行
在第二个示例中,我们将一个新的汽车对象保存到数据库中。 pom.xml
,persistence.xml
和Car.java
与前面示例中使用的相同。
DBClient2.java
该示例创建一个新的汽车对象并将其保存在数据库中。
JEE 容器外部不提供自动事务管理; 因此,我们必须手动创建一个新事务。
创建一个新的汽车实体。 该 ID 将由 Derby 生成。
persist()
方法将实体保存到数据库中。
事务已提交。
EclipseLink 的 Spring Boot 示例
在此示例中,我们将 EclipseLink 集成到 Spring Boot 应用中。 Spring 是流行的 Java 应用框架。 Spring Boot 是 Spring 的解决方案,用于创建独立的,生产级的基于 Spring 的应用。 这是一个新的解决方案,可以以最少的工作量创建 Spring 应用。
以下示例的资源也可从作者的 Github 存储库中获得。
Figure: Spring Boot project
这是 NetBeans 中的 Spring Boot 项目。
pom.xml
这是 Maven 项目文件。 我们具有 EclipseLink,Derby,Hibernate Validator 和 Spring Boot 的依赖项。
application.properties
在application.properties
文件中,我们定义了 Derby 的数据源。
persistence.xml
在persistence.xml
文件中,我们创建一个持久性单元。 它称为cars-pu
。 我们还让 EclipseLink 为我们创建一个数据库表。
data.sql
EclipseLink 将使用此 SQL 文件用数据填充自动创建的表。
AppConf.java
在AppConf
中创建了两个 bean:EntityManagerFactory
和EntityManager
。 EntityManager
将被注入CarsServiceImpl
中。
Car.java
这是我们的Entity
bean。
该类用命名查询注释,这是 JPQL 语句,用于检索所有汽车对象并按名称查找汽车。
CarsService.java
在CarsService
界面中,我们定义了通过实体管理器访问数据库的合同方法。
CarsServiceImpl.java
CarsServiceImpl
是一个业务服务类,它实现以下方法:保存汽车,按汽车名称查找汽车,以及从数据库中检索所有汽车。
将EntityManager
与@PersistenceContext
注解一起注入到类中。
saveCar()
方法通过EntityManager's
persist()
方法将汽车保存到数据库中。 persist()
方法放置在手动创建的事务中。
findCarByName()
方法通过其名称查找汽车。 createNamedQuery()
创建一个命名查询; 它引用Car
实体类中定义的命名查询。 使用setParameter()
方法将参数设置为命名查询。
创建一个命名查询Car.findAll
。 查询的getResultList()
返回已检索汽车的列表。
MyRunner.java
MyRunner
是 Spring Boot CLI 应用的命令行运行程序。 我们寻找雪铁龙汽车,并从数据库中检索所有汽车。
CarsService
bean 被注入到MyRunner
类中。
该服务的findCarByName()
寻找一辆名为雪铁龙的汽车。
服务的findAll()
方法从数据库中检索所有汽车。
SpringDBCLIApp.java
SpringDBCLIApp
设置 Spring Boot CLI 应用。
在本教程中,我们介绍了 EclipseLink JPA 提供程序。