从 Spring Boot 2.7.2 升级到 Spring Boot 3.0.0-SNAPSHOT: java: 包 javax.persistence 不存在

nhu*_*uvy 14 spring jpa spring-boot

当我使用 Spring Boot 2.7.2 时,一切正常。升级到版本 3.0.0-SNAPSHOT 后,我有

我的pom.xml

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>3.0.0-SNAPSHOT</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>
    <groupId>com.example</groupId>
    <artifactId>spring_jwt</artifactId>
    <version>1.0.0-SNAPSHOT</version>
    <name>spring-boot-security-jwt</name>
    <description>spring_jwt</description>
    <properties>
        <java.version>18</java.version>
    </properties>
    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-jpa</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-security</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-validation</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <dependency>
            <groupId>io.jsonwebtoken</groupId>
            <artifactId>jjwt-api</artifactId>
            <version>0.11.5</version>
        </dependency>
        <dependency>
            <groupId>io.jsonwebtoken</groupId>
            <artifactId>jjwt-impl</artifactId>
            <version>0.11.5</version>
            <scope>runtime</scope>
        </dependency>
        <dependency>
            <groupId>io.jsonwebtoken</groupId>
            <artifactId>jjwt-jackson</artifactId>
            <version>0.11.5</version>
            <scope>runtime</scope>
        </dependency>
        <dependency>
            <groupId>jakarta.xml.bind</groupId>
            <artifactId>jakarta.xml.bind-api</artifactId>
            <version>4.0.0</version>
        </dependency>
        <dependency>
            <groupId>javax.xml.bind</groupId>
            <artifactId>jaxb-api</artifactId>
            <version>2.3.1</version>
        </dependency>
        <dependency>
            <groupId>com.fasterxml.jackson.datatype</groupId>
            <artifactId>jackson-datatype-hibernate5</artifactId>
            <version>2.13.3</version>
        </dependency>
        <dependency>
            <groupId>org.postgresql</groupId>
            <artifactId>postgresql</artifactId>
            <scope>runtime</scope>
        </dependency>
        <dependency>
            <groupId>org.springdoc</groupId>
            <artifactId>springdoc-openapi-ui</artifactId>
            <version>1.6.9</version>
        </dependency>
        <dependency>
            <groupId>org.springdoc</groupId>
            <artifactId>springdoc-openapi-security</artifactId>
            <version>1.6.9</version>
        </dependency>
        <dependency>
            <groupId>commons-io</groupId>
            <artifactId>commons-io</artifactId>
            <version>2.11.0</version>
        </dependency>

        <dependency>
            <groupId>net.sf.jasperreports</groupId>
            <artifactId>jasperreports</artifactId>
            <version>6.20.0</version>
        </dependency>
        <dependency>
            <groupId>net.sf.jasperreports</groupId>
            <artifactId>jasperreports-fonts</artifactId>
            <version>6.20.0</version>
        </dependency>
        <dependency>
            <groupId>net.sf.jasperreports</groupId>
            <artifactId>jasperreports-functions</artifactId>
            <version>6.20.0</version>
        </dependency>
        <dependency>
            <groupId>net.sf.jasperreports</groupId>
            <artifactId>jasperreports-metadata</artifactId>
            <version>6.20.0</version>
        </dependency>
        <dependency>
            <groupId>net.sf.jasperreports</groupId>
            <artifactId>jasperreports-chart-themes</artifactId>
            <version>6.20.0</version>
        </dependency>
        <dependency>
            <groupId>net.sf.jasperreports</groupId>
            <artifactId>jasperreports-annotation-processors</artifactId>
            <version>6.20.0</version>
        </dependency>
        <dependency>
            <groupId>net.sf.jasperreports</groupId>
            <artifactId>jasperreports-castor</artifactId>
            <version>6.20.0</version>
        </dependency>


<!--        <dependency>-->
<!--            <groupId>net.sf.jasperreports</groupId>-->
<!--            <artifactId>liberation-fonts</artifactId>-->
<!--            <version>1.0</version>-->
<!--        </dependency>-->
        <!-- https://mvnrepository.com/artifact/com.mpobjects.jasperreports.font/jasperreports-fonts-liberation -->
        <dependency>
            <groupId>com.mpobjects.jasperreports.font</groupId>
            <artifactId>jasperreports-fonts-liberation</artifactId>
            <version>2.1.2</version>
        </dependency>


        <dependency>
            <groupId>net.sf.jasperreports</groupId>
            <artifactId>jasperreports-chart-customizers</artifactId>
            <version>6.20.0</version>
        </dependency>
        <dependency>
            <groupId>net.sf.jasperreports</groupId>
            <artifactId>jasperreports-custom-visualization</artifactId>
            <version>6.20.0</version>
        </dependency>

        <!-- https://mvnrepository.com/artifact/commons-beanutils/commons-beanutils -->
        <dependency>
            <groupId>commons-beanutils</groupId>
            <artifactId>commons-beanutils</artifactId>
            <version>1.9.4</version>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-devtools</artifactId>
            <scope>runtime</scope>
            <optional>true</optional>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-configuration-processor</artifactId>
            <optional>true</optional>
        </dependency>

<!--        <dependency>-->
<!--            <groupId>com.stimulsoft</groupId>-->
<!--            <artifactId>stimulsoft-reports-report</artifactId>-->
<!--            <version>2022.3.3</version>-->
<!--        </dependency>-->
<!--        <dependency>-->
<!--            <groupId>com.stimulsoft</groupId>-->
<!--            <artifactId>stimulsoft-reports-web</artifactId>-->
<!--            <version>2022.3.3</version>-->
<!--        </dependency>-->
<!--        <dependency>-->
<!--            <groupId>com.stimulsoft</groupId>-->
<!--            <artifactId>stimulsoft-reports-base</artifactId>-->
<!--            <version>2022.3.3</version>-->
<!--        </dependency>-->
<!--        <dependency>-->
<!--            <groupId>com.stimulsoft</groupId>-->
<!--            <artifactId>stimulsoft-reports-viewer</artifactId>-->
<!--            <version>2022.3.3</version>-->
<!--        </dependency>-->
<!--        <dependency>-->
<!--            <groupId>com.stimulsoft</groupId>-->
<!--            <artifactId>stimulsoft-reports-samples</artifactId>-->
<!--            <version>2022.3.3</version>-->
<!--        </dependency>-->
<!--        <dependency>-->
<!--            <groupId>com.stimulsoft</groupId>-->
<!--            <artifactId>stimulsoft-reports-webviewer</artifactId>-->
<!--            <version>2022.3.3</version>-->
<!--        </dependency>-->
<!--        <dependency>-->
<!--            <groupId>com.stimulsoft</groupId>-->
<!--            <artifactId>stimulsoft-reports-lib</artifactId>-->
<!--            <version>2022.3.3</version>-->
<!--        </dependency>-->
<!--        <dependency>-->
<!--            <groupId>com.stimulsoft</groupId>-->
<!--            <artifactId>stimulsoft-reports-webdesigner</artifactId>-->
<!--            <version>2022.3.3</version>-->
<!--        </dependency>-->
<!--        <dependency>-->
<!--            <groupId>com.stimulsoft</groupId>-->
<!--            <artifactId>reports</artifactId>-->
<!--            <version>2022.3.3</version>-->
<!--            <type>pom</type>-->
<!--        </dependency>-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
        <dependency>
            <groupId>org.springframework.security</groupId>
            <artifactId>spring-security-test</artifactId>
            <scope>test</scope>
        </dependency>
    </dependencies>
    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>

    <repositories>
        <repository>
            <id>maven-central</id>
            <name>Maven Central</name>
            <url>https://repo1.maven.org/maven2</url>
            <snapshots>
                <enabled>false</enabled>
            </snapshots>
        </repository>

        <repository>
            <id>spring-milestones</id>
            <name>Spring Milestones</name>
            <url>https://repo.spring.io/milestone</url>
            <snapshots>
                <enabled>false</enabled>
            </snapshots>
        </repository>

        <repository>
            <id>spring-snapshots</id>
            <name>Spring Snapshots</name>
            <url>https://repo.spring.io/snapshot</url>
            <releases>
                <enabled>false</enabled>
            </releases>
        </repository>
    </repositories>

    <pluginRepositories>
        <pluginRepository>
            <id>spring-milestones</id>
            <name>Spring Milestones</name>
            <url>https://repo.spring.io/milestone</url>
            <snapshots>
                <enabled>false</enabled>
            </snapshots>
        </pluginRepository>

        <pluginRepository>
            <id>spring-snapshots</id>
            <name>Spring Snapshots</name>
            <url>https://repo.spring.io/snapshot</url>
            <releases>
                <enabled>false</enabled>
            </releases>
        </pluginRepository>
    </pluginRepositories>
</project>

Run Code Online (Sandbox Code Playgroud)

实体

package com.example.BLModel;

import javax.persistence.Column;
import javax.persistence.EmbeddedId;
import javax.persistence.Entity;
import javax.persistence.FetchType;
import javax.persistence.JoinColumn;
import javax.persistence.ManyToOne;
import javax.persistence.MapsId;
import javax.persistence.Table;
import java.time.OffsetDateTime;

@Entity
@Table(name = "account")
public class Account {
    @EmbeddedId
    private AccountId id;

    @MapsId("tenantId")
    @ManyToOne(fetch = FetchType.LAZY, optional = false)
    @JoinColumn(name = "tenant_id", nullable = false)
    private Tenant tenant;

    @Column(name = "account_number", nullable = false, length = 32)
    private String accountNumber;

    @Column(name = "account_name", nullable = false, length = 128)
    private String accountName;

    @Column(name = "account_name_english", length = 128)
    private String accountNameEnglish;

    @Column(name = "account_name_chinese", length = 128)
    private String accountNameChinese;

    @Column(name = "account_name_korean", length = 128)
    private String accountNameKorean;

    @Column(name = "description", length = 512)
    private String description;

    @Column(name = "parent_id")
    private Short parentId;

    @Column(name = "internal_code_id", length = 128)
    private String internalCodeId;

    @Column(name = "grade")
    private Short grade;

    @Column(name = "is_parent", nullable = false)
    private Boolean isParent = false;

    @Column(name = "account_category_kind", nullable = false)
    private Short accountCategoryKind;

    @Column(name = "is_postable_in_foreign_currency", nullable = false)
    private Boolean isPostableInForeignCurrency = false;

    @Column(name = "detail_by_account_object", nullable = false)
    private Boolean detailByAccountObject = false;

    @Column(name = "account_object_type")
    private Short accountObjectType;

    @Column(name = "detail_by_bank_account", nullable = false)
    private Boolean detailByBankAccount = false;

    @Column(name = "detail_by_job", nullable = false)
    private Boolean detailByJob = false;

    @Column(name = "detail_by_job_kind")
    private Short detailByJobKind;

    @Column(name = "detail_by_project_work", nullable = false)
    private Boolean detailByProjectWork = false;

    @Column(name = "detail_by_project_work_kind")
    private Short detailByProjectWorkKind;

    @Column(name = "detail_by_order", nullable = false)
    private Boolean detailByOrder = false;

    @Column(name = "detail_by_order_kind")
    private Short detailByOrderKind;

    @Column(name = "detail_by_contract", nullable = false)
    private Boolean detailByContract = false;

    @Column(name = "detail_by_contract_kind")
    private Short detailByContractKind;

    @Column(name = "detail_by_expense_item", nullable = false)
    private Boolean detailByExpenseItem = false;

    @Column(name = "detail_by_expense_item_kind")
    private Short detailByExpenseItemKind;

    @Column(name = "detail_by_department", nullable = false)
    private Boolean detailByDepartment = false;

    @Column(name = "detail_by_department_kind")
    private Short detailByDepartmentKind;

    @Column(name = "detail_by_list_item", nullable = false)
    private Boolean detailByListItem = false;

    @Column(name = "detail_by_list_item_kind")
    private Short detailByListItemKind;

    @Column(name = "active_status", nullable = false)
    private Boolean activeStatus = false;

    @Column(name = "created")
    private OffsetDateTime created;

    @Column(name = "created_by", length = 64)
    private String createdBy;

    @Column(name = "modified")
    private OffsetDateTime modified;

    @Column(name = "modified_by", length = 64)
    private String modifiedBy;

    @Column(name = "sort_internal_code_id", length = 128)
    private String sortInternalCodeId;

    @Column(name = "detail_by_pu_contract", nullable = false)
    private Boolean detailByPuContract = false;

    @Column(name = "detail_by_pu_contract_kind")
    private Short detailByPuContractKind;

    public AccountId getId() {
        return id;
    }

    public void setId(AccountId id) {
        this.id = id;
    }

    public Tenant getTenant() {
        return tenant;
    }

    public void setTenant(Tenant tenant) {
        this.tenant = tenant;
    }

    public String getAccountNumber() {
        return accountNumber;
    }

    public void setAccountNumber(String accountNumber) {
        this.accountNumber = accountNumber;
    }

    public String getAccountName() {
        return accountName;
    }

    public void setAccountName(String accountName) {
        this.accountName = accountName;
    }

    public String getAccountNameEnglish() {
        return accountNameEnglish;
    }

    public void setAccountNameEnglish(String accountNameEnglish) {
        this.accountNameEnglish = accountNameEnglish;
    }

    public String getAccountNameChinese() {
        return accountNameChinese;
    }

    public void setAccountNameChinese(String accountNameChinese) {
        this.accountNameChinese = accountNameChinese;
    }

    public String getAccountNameKorean() {
        return accountNameKorean;
    }

    public void setAccountNameKorean(String accountNameKorean) {
        this.accountNameKorean = accountNameKorean;
    }

    public String getDescription() {
        return description;
    }

    public void setDescription(String description) {
        this.description = description;
    }

    public Short getParentId() {
        return parentId;
    }

    public void setParentId(Short parentId) {
        this.parentId = parentId;
    }

    public String getInternalCodeId() {
        return internalCodeId;
    }

    public void setInternalCodeId(String internalCodeId) {
        this.internalCodeId = internalCodeId;
    }

    public Short getGrade() {
        return grade;
    }

    public void setGrade(Short grade) {
        this.grade = grade;
    }

    public Boolean getIsParent() {
        return isParent;
    }

    public void setIsParent(Boolean isParent) {
        this.isParent = isParent;
    }

    public Short getAccountCategoryKind() {
        return accountCategoryKind;
    }

    public void setAccountCategoryKind(Short accountCategoryKind) {
        this.accountCategoryKind = accountCategoryKind;
    }

    public Boolean getIsPostableInForeignCurrency() {
        return 

rop*_*pa8 31

无需在 pom.xml 中添加 hibernate-entitymanager 工件作为依赖项。

spring-boot-starter-data-jpa 工件就足够了。您应该只考虑以下几点。

将 Java EE 8 替换为 Jakarta EE 9 API:

Spring Boot 3.0 将是第一个使用 Jakarta EE 9 API (jakarta. ) 而不是 EE 8 (javax. ) 的 Spring Boot 版本。这意味着我们必须使用 javax.* 查找 EE 8 导入并将其替换为 jakarta.*。Spring Boot 微服务中使用的典型 EE 8 包包括以下内容:

  • javax.持久性。*

  • javax.validation.*

  • javax.servlet.*

  • javax.annotation.*

  • javax.transaction.*

  • ETC。

请注意,javax.sql.* 和 javax.crypto.* 等包来自 Java 17 JDK,而不是来自 EE 8,因此可以安全地保留它们。

参考:

Spring-Boot-3 升级注意事项

准备 Spring-Boot-3-0


yuy*_*yu5 11

我自己经历了这个地狱至少6个小时。真正的答案在Spring Boot 迁移指南的部分中描述,它们指出我们将Spring 替换javaxjakarta.

基本上,您所要做的就是用 Ctrl+Shift+F 替换(几乎)您以前拥有的任何位置javax并将其交换为jakarta. 如果您像我一样,由于某种原因,我的 IDE 不会自动完成或识别它,直到我手动输入它,所以如果您的 IDE 做了同样的事情,请不要让您的 IDE 欺骗您。FWIW,这个结论也得到了其他人的支持,但从作者的文档中非常不清楚我们需要做的就是这个简单的改变。

我希望这可以帮助你不要像我一样浪费半天的时间 xD


nhu*_*uvy 0

更改“JPA API from Java EE”-->“JPA API from Jakarta EE”,并添加

<!-- https://mvnrepository.com/artifact/org.hibernate/hibernate-entitymanager -->
<dependency>
    <groupId>org.hibernate</groupId>
    <artifactId>hibernate-entitymanager</artifactId>
    <version>6.0.0.Alpha7</version>
    <type>pom</type>
</dependency>
Run Code Online (Sandbox Code Playgroud)

  • 如果您添加 spring-boot-starter-data-jpa 作为依赖项,您将获得与 Spring 版本兼容的 Jakarta EE 依赖项。 (4认同)