• 从 JPA 2.x 迁移到 3.0


    我最近收到了很多关于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 中引入的更改以及所需的迁移步骤。

    内容[隐藏]

    它不同,但仍然相同

    如果你仔细看看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 脚本轻松更改导入语句。

  • 相关阅读:
    团队协作如何确保项目Node版本的一致性?
    FPGA与ASIC有什么差异?二者该如何选用?
    Node面试题总结最全
    野风药业IPO被终止:曾拟募资5.4亿 实控人俞蘠曾进行P2P投资
    CENTOS7安装redis在/home/pms/software路径下,并且将redis加入到systemctl中
    小程序在政务服务平台建设中如何发挥价值
    Nginx快速入门及配置文件结构
    springboot家政服务管理平台 LW +PPT+源码+讲解
    python学习笔记(2)—— 控制流
    web大学生个人网站作业模板——上海旅游景点介绍网页代码 家乡旅游网页制作模板 大学生静态HTML网页源码...
  • 原文地址:https://blog.csdn.net/allway2/article/details/128175834