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

应用启动部署报错:HibernatePersistenceProvider类型转换异常

持久化层配置启动异常排查

启动时出现的问题

  • JVM不支持查找Web应用[hvc]的ThreadLocal引用,需添加--add-opens java.base/java.lang=ALL-UNNAMED参数启用该功能;
  • 部署期间出错:准备应用时发生异常,无法将org.hibernate.jpa.HibernatePersistenceProvider转换为jakarta.persistence.spi.PersistenceProvider。

项目依赖

(依赖截图包含Hibernate、JPA相关组件)

persistence.xml配置

<?xml version="1.0" encoding="UTF-8"?>
<persistence version="2.0"
    xmlns="http://java.sun.com/xml/ns/persistence"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
             xsi:schemaLocation="http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_2_0.xsd">
    <persistence-unit name="HealthcheckJPA" transaction-type="JTA">
        <provider>org.hibernate.jpa.HibernatePersistenceProvider</provider>
        <jta-data-source>jdbc/hvc</jta-data-source>
        <shared-cache-mode>ENABLE_SELECTIVE</shared-cache-mode>
        <properties>
            <property  />
        </properties>
    </persistence-unit>
    <persistence-unit name="HVCJPA"
        transaction-type="JTA">
        <provider>org.hibernate.jpa.HibernatePersistenceProvider</provider>
        <jta-data-source>jdbc/hvc</jta-data-source>
        <shared-cache-mode>ENABLE_SELECTIVE</shared-cache-mode>
        <properties>
            <property />
        </properties>
    </persistence-unit>
    <persistence-unit name="HVCJPATest"
        transaction-type="RESOURCE_LOCAL">
        <provider>org.hibernate.jpa.HibernatePersistenceProvider</provider>
        <class>entity classes</class>
        <shared-cache-mode>ENABLE_SELECTIVE</shared-cache-mode>
        <properties>
            <property name="eclipselink.logging.level" value="FINE" />
            <property name="eclipselink.target-database" value="Oracle" />
            <property name="eclipselink.logging.thread" value="false" />
            <!-- other properties -->
        </properties>
    </persistence-unit>
</persistence>

问题解决思路与方案

针对ThreadLocal引用问题

Java 9及以上版本的模块系统默认限制了对java.lang包的反射访问,直接在JVM启动参数中添加:

--add-opens java.base/java.lang=ALL-UNNAMED

该参数开放java.base模块下的java.lang包给所有未命名模块,即可解决反射访问限制问题。

针对类型转换异常

核心原因是JPA规范包名迁移(从javax.persistence到jakarta.persistence)及配置/依赖冲突,对应解决方案如下:

  1. 规范版本与依赖匹配:

    • 若环境为Jakarta EE(如Tomcat 10+、WildFly 27+),需使用适配Jakarta的Hibernate版本(Hibernate 6.x及以上),同时更新persistence.xml的命名空间为Jakarta规范:
      <?xml version="1.0" encoding="UTF-8"?>
      <persistence version="3.0"
                   xmlns="https://jakarta.ee/xml/ns/persistence"
                   xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
                   xsi:schemaLocation="https://jakarta.ee/xml/ns/persistence https://jakarta.ee/xml/ns/persistence/persistence_3_0.xsd">
      
    • 若环境为传统Java EE(如Tomcat 9、WildFly 26及以下),则使用Hibernate 5.x版本,对应javax.persistence规范,需确保依赖中不存在jakarta.persistence-api。
  2. 修正配置冲突:
    HVCJPATest持久化单元中,指定Hibernate作为Provider却配置了EclipseLink的参数,两者完全不兼容,需二选一:

    • 保留Hibernate:将所有eclipselink.*属性替换为Hibernate对应配置,比如日志级别用hibernate.show_sql、hibernate.format_sql等;
    • 改用EclipseLink:将<provider>改为org.eclipse.persistence.jpa.PersistenceProvider,保留现有EclipseLink配置。
  3. 排查依赖冲突:
    检查项目依赖,确保不同时存在javax.persistence-api和jakarta.persistence-api,避免类加载冲突。

内容的提问来源于stack exchange,提问作者Himanshu Gupta

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.15 03:56:01