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

Spring Boot将默认ORM从Hibernate切换为EclipseLink报错求助

问题1:编译错误解决方案

错误原因

你的pom.xml中未引入spring-boot-starter-data-jpa依赖,org.springframework.orm.jpa.vendor、org.springframework.transaction.jta等包都来自该依赖,缺少依赖导致编译时找不到类。同时Spring Boot JPA默认内置Hibernate,需要手动排除避免冲突。

修改pom.xml依赖

在dependencies节点中添加如下依赖:

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-data-jpa</artifactId>
    <!-- 排除默认的Hibernate依赖 -->
    <exclusions>
        <exclusion>
            <groupId>org.hibernate</groupId>
            <artifactId>hibernate-core</artifactId>
        </exclusion>
    </exclusions>
</dependency>

其他代码问题修正

  1. EclipseLinkJpaConfiguration类中,你定义的detectWeavingMode()方法未使用,织入参数需要修改为动态判断,避免无 instrumentation 环境下启动失败:
@Override
protected Map<String, Object> getVendorProperties() {
    HashMap<String, Object> map = new HashMap<>();
    map.put(PersistenceUnitProperties.WEAVING, detectWeavingMode());
    map.put(PersistenceUnitProperties.DDL_GENERATION, "drop-and-create-tables");
    return map;
}
  1. 自定义的EclipseLinkFactory类完全不需要,Spring会自动管理EntityManager的生命周期,直接通过@PersistenceContext注入即可使用,自行创建的工厂无法和Spring事务体系整合,还会导致资源泄漏,直接删除该类即可。

问题2:persistence.xml配置方案

实现步骤

  1. 路径配置:在src/main/resources目录下创建META-INF文件夹,再在该文件夹下创建persistence.xml文件,Maven编译时会自动将该文件加载到类路径下。
  2. 依赖配置:除了org.eclipse.persistence.jpa和数据库驱动依赖外,还是需要添加上述排除了Hibernate的spring-boot-starter-data-jpa依赖,Maven会自动下载所有依赖包,无需额外操作。
  3. persistence.xml配置示例:
<?xml version="1.0" encoding="UTF-8"?>
<persistence version="2.2"
             xmlns="http://xmlns.jcp.org/xml/ns/persistence"
             xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
             xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/persistence
             http://xmlns.jcp.org/xml/ns/persistence/persistence_2_2.xsd">
    <persistence-unit name="cars-pu" transaction-type="RESOURCE_LOCAL">
        <provider>org.eclipse.persistence.jpa.PersistenceProvider</provider>
        <!-- 配置你的实体类所在包,也可以写具体的实体类全路径 -->
        <class>com.example.entity.XXX</class>
        <properties>
            <!-- 数据库连接配置,也可以放在application.yml里,这里二选一 -->
            <property name="javax.persistence.jdbc.driver" value="com.mysql.cj.jdbc.Driver"/>
            <property name="javax.persistence.jdbc.url" value="jdbc:mysql://localhost:3306/你的库名?useSSL=false&serverTimezone=GMT%2B8"/>
            <property name="javax.persistence.jdbc.user" value="root"/>
            <property name="javax.persistence.jdbc.password" value="你的密码"/>
            <!-- EclipseLink参数 -->
            <property name="eclipselink.weaving" value="static"/>
            <property name="eclipselink.ddl-generation" value="drop-and-create-tables"/>
            <property name="eclipselink.logging.level" value="FINE"/>
        </properties>
    </persistence-unit>
</persistence>
  1. 使用方式:配置完成后无需额外代码,直接通过@PersistenceContext注入EntityManager即可操作带关联关系的实体,事务由Spring托管。

注意事项

  • 配置persistence.xml后,就不需要再写EclipseLinkJpaConfiguration配置类,两种配置二选一即可,避免冲突。
  • 你当前pom中同时引入了MySQL和SQL Server两个驱动,按实际使用的数据库保留一个即可,避免不必要的冲突。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.15 22:54:04