You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用javax.persistence开发Spring Batch遇Jakarta API类型转换错误求助

Spring Batch中JPA类型不兼容问题解决

你遇到的错误包含两部分核心问题:API包冲突(javax vs Jakarta) 和 代码本身的类型不匹配错误,以下是具体解决步骤:

一、先修复代码中的低级类型错误

你的配置类里存在明显的类型传参错误:JpaPagingItemReader和JpaItemWriter的setEntityManagerFactory方法要求传入EntityManagerFactory类型,但你却传了EntityManager对象,这和javax/Jakarta的包冲突无关,是代码逻辑错误,先修正这部分:

修改earmarkItemReader和earmarkItemWriter方法:

@Bean
public ItemReader<Earmark> earmarkItemReader() {
    JpaPagingItemReader<Earmark> reader = new JpaPagingItemReader<>();
    // 把entityManager替换为已注入的entityManagerFactory
    reader.setEntityManagerFactory(entityManagerFactory);
    reader.setQueryString("SELECT e FROM Earmark e WHERE e.status = 'Pending'");
    reader.setParameterValues(Collections.emptyMap());
    reader.setPageSize(100);
    return reader;
}

@Bean
public ItemWriter<Earmark> earmarkItemWriter() {
    JpaItemWriter<Earmark> writer = new JpaItemWriter<>();
    // 同样替换为entityManagerFactory
    writer.setEntityManagerFactory(entityManagerFactory);
    return writer;
}

另外,类中声明的private EntityManager entityManager;没有注入且现在用不到,直接删掉即可。

二、统一依赖版本,解决javax/Jakarta包冲突

你的pom.xml存在严重的版本混乱,这是导致API包冲突的根源:

  1. Spring Boot 3.x要求Java 17及以上,但你配置的java.version是1.8,这会直接导致编译错误,先升级Java版本。
  2. Parent用了Spring Boot 3.0.6,但spring.boot.version却设为2.6.7,版本不一致,统一为3.0.6。
  3. 手动引入了hibernate-jpa-2.1-api(属于javax包),但Spring Boot 3.x和Hibernate 6.x都基于Jakarta EE,这个依赖必须删除。
  4. Spring Boot Starter会自动管理Hibernate等依赖的版本,尽量不要手动指定版本号,避免冲突。

修改后的pom.xml关键部分:

<properties>
    <!-- 升级Java版本到17 -->
    <java.version>17</java.version>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    <maven.compiler.source>${java.version}</maven.compiler.source>
    <maven.compiler.target>${java.version}</maven.compiler.target>
    <!-- 统一Spring Boot版本与parent保持一致 -->
    <spring.boot.version>3.0.6</spring.boot.version>
</properties>

<dependencies>
    <!-- 保留Spring Boot Starter依赖,自动管理版本 -->
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-batch</artifactId>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-data-jpa</artifactId>
    </dependency>
    <!-- 删除hibernate-jpa-2.1-api依赖 -->
    <!-- 其他依赖按需保留,但确保版本与Spring Boot 3.x兼容 -->
</dependencies>

三、替换所有javax.persistence引用为jakarta.persistence

Spring Boot 3.x已完全迁移到Jakarta EE规范,不再支持javax包,把项目中所有import javax.persistence.*;替换为import jakarta.persistence.*;,包括配置类、实体类等:

// 替换前
import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;

// 替换后
import jakarta.persistence.EntityManager;
import jakarta.persistence.EntityManagerFactory;

总结

  1. 先修正代码中的类型传参错误,这是导致当前错误提示的直接原因。
  2. 统一Spring Boot版本,升级Java到17,移除冲突的javax依赖。
  3. 全局替换javax.persistence为jakarta.persistence,适配Jakarta EE规范。

内容的提问来源于stack exchange,提问作者Shailesh Patil

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.22 07:32:22