我最近收到了很多关于JPA 3.0的问题,由于EclipseLink和Hibernate现在提供了对它的全面支持,现在是时候仔细看看规范的最新更新了。作为从Java EE到Jakarta EE转换的一部分,Java Persistence API(JPA)更名为Jakarta Persistence API(JPA)。该过程的第一步发生在 JPA 2.2 中,现在在 JPA 3.0 中完成。让我们仔细看看 JPA 3.0 中引入的更改以及所需的迁移步骤。
内容[隐藏]
1它不同,但仍然相同 阿拉伯数字实现 JPA 3.0 的框架 3迁移现有应用程序 3.1更改与 JPA 相关的导入 3.2更新 XML 命名空间 3.3迁移配置参数 四结论
它不同,但仍然相同
如果你仔细看看JPA 3.0,似乎什么都没有改变。这并非完全错误。JPA 3.0 没有带来任何新功能。它仅更改所有 API 类的包名称的前缀、某些配置属性的前缀以及所有基于 XML 的配置文件的架构命名空间。这些更改的目的是替换“java”一词以避免法律问题。
软件包名称和配置参数名称的前缀从javax.persistence.*更改为jakarta.persistence.* ,例如,@Entity 注释所需的导入从javax.persistence.Entity 更改为jakarta.persistence.Entity,javax.persistence.schema-generation.database.action属性的名称更改为jakarta.persistence.schema-generation.database.action .除此之外,XML 命名空间从http://xmlns.jcp.org/xml/ns/persistence 和 http://xmlns.jcp.org/xml/ns/persistence/orm 更改为https://jakarta.ee/xml/ns/persistence 和https://jakarta.ee/xml/ns/persistence/orm 。
这些更改完成了从 Java EE 到 Jakarta EE 的过渡过程。遗憾的是,它们还要求您迁移代码和配置文件。
实现 JPA 3.0 的框架
JPA 规范的 2 个最流行的实现支持版本 3.0。如果要使用 EclipseLink,则至少需要使用 3.0 版。
1
2
3
4
5
<dependency>
<groupId>org.eclipse.persistencegroupId>
<artifactId>org.eclipse.persistence.jpaartifactId>
<version>3.0.1version>
dependency>
Hibernate在5.5版本中开始支持JPA 3.0。所有支持新 JPA 3.0 API 的 Hibernate 工件的名称中都有后缀“-jakarta”。如果仍想使用旧的 API,可以坚持使用旧的工件名称。
1
2
3
4
5
<dependency>
<groupId>org.hibernategroupId>
<artifactId>hibernate-core-jakartaartifactId>
<version>5.5.2version>
dependency>
迁移现有应用程序
将依赖项更新为上面列出的依赖项之一后,需要对导入语句和配置文件进行一些更改。但是,别担心,它并不像看起来那么糟糕。您可以使用 IDE 中的搜索和替换功能或在命令行上执行一些基本命令来完成大部分工作。
更改与 JPA 相关的导入
如前所述,与 JPA 2.2 相比,JPA 3.0 没有添加或更改任何功能。它只是将包从javax.persistence更改为jakarta.persistence 。因此,您可以简单地将所有出现的“import javax.persistence”替换为“import jakarta.persistence”。
执行此操作后,实体类的导入应类似于以下代码段,并且所有映射定义都应保持不变。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
import jakarta.persistence.Entity;
import jakarta.persistence.FetchType;
import jakarta.persistence.GeneratedValue;
import jakarta.persistence.GenerationType;
import jakarta.persistence.Id;
import jakarta.persistence.ManyToOne;
import jakarta.persistence.Version;
@Entity
public class ChessGame {
@Id
@GeneratedValue(strategy = GenerationType.SEQUENCE)
private Long id;
private LocalDate date;
private int round;
@Version
private int version;
@ManyToOne
private ChessTournament chessTournament;
@ManyToOne(fetch = FetchType.LAZY)
private ChessPlayer playerWhite;
@ManyToOne(fetch = FetchType.LAZY)
private ChessPlayer playerBlack;
...
}
更新 XML 命名空间
如果使用orm.xml 或持久性.xml 文件来定义映射或配置持久性单元,则还应更新命名空间和架构定义。
在持久性.xml配置中,需要将http://xmlns.jcp.org/xml/ns/persistence 替换为https://jakarta.ee/xml/ns/persistence 。
1
2
3
4
5
6
7
8
9
xml version="1.0" encoding="UTF-8" standalone="yes"?>
<persistence xmlns="Jakarta Persistence XML Schemas | The Eclipse Foundation"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
version="3.0"
xsi:schemaLocation="Jakarta Persistence XML Schemas | The Eclipse Foundation https://jakarta.ee/xml/ns/persistence/persistence_3_0.xsd">
<persistence-unit name="my-persistence-unit">
...
persistence-unit>
persistence>
在包含映射定义的orm.xml文件中,您需要将 http://xmlns.jcp.org/xml/ns/persistence/orm 替换为https://jakarta.ee/xml/ns/persistence/orm 。
1
2
3
4
5
6
7
8
xml version="1.0" encoding="UTF-8" standalone="yes"?>
<entity-mappings version="3.0"
xmlns="https://jakarta.ee/xml/ns/persistence/orm"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<entity class="com.thorben.janssen.model.ChessPlayer" name="ChessPlayer">
...
entity>
entity-mappings>
迁移配置参数
要将应用程序迁移到 JPA 3.0,您需要做的最后一件事是更新配置参数的名称。这些通常在您的持久性.xml文件中定义和使用,我在JPA 持久性初学者指南中详细介绍了所有这些.xml。
其中一些属性的名称包括前缀“javax.persistence”,例如“javax.persistence.jdbc.driver”。对于所有这些参数,您需要将“javax.persistence”替换为“jakarta.persistence”。执行此操作后,您的配置类似于以下代码片段。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
xml version="1.0" encoding="UTF-8" standalone="yes"?>
<persistence xmlns="Jakarta Persistence XML Schemas | The Eclipse Foundation"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
version="3.0"
xsi:schemaLocation="Jakarta Persistence XML Schemas | The Eclipse Foundation https://jakarta.ee/xml/ns/persistence/persistence_3_0.xsd">
<persistence-unit name="my-persistence-unit">
<description>Hibernate example configuration - thorben-janssen.comdescription>
<exclude-unlisted-classes>falseexclude-unlisted-classes>
<properties>
<property name="hibernate.jdbc.time_zone" value="UTC"/>
<property name="jakarta.persistence.jdbc.driver" value="org.postgresql.Driver"/>
<property name="jakarta.persistence.jdbc.url" value="jdbc:postgresql://localhost:5432/test"/>
<property name="jakarta.persistence.jdbc.user" value="postgres"/>
<property name="jakarta.persistence.jdbc.password" value="postgres"/>
<property name="jakarta.persistence.schema-generation.database.action" value="drop-and-create"/>
<property name="jakarta.persistence.sql-load-script-source" value="data.sql"/>
properties>
persistence-unit>
persistence>
结论
JPA 3.0 更改了所有类的包、配置文件的 XML 命名空间以及一些配置参数的名称,以完成从 Java 持久性 API 到 Jakarta 持久性 API 的转换。特别是包名称的更改可能看起来像一个巨大的变化,导致现有项目中的大量工作。但它并不像看起来那么糟糕。您可以使用 IDE 的搜索和替换功能或基本 shell 脚本轻松更改导入语句。