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>
其他代码问题修正
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; }
- 自定义的
EclipseLinkFactory类完全不需要,Spring会自动管理EntityManager的生命周期,直接通过@PersistenceContext注入即可使用,自行创建的工厂无法和Spring事务体系整合,还会导致资源泄漏,直接删除该类即可。
问题2:persistence.xml配置方案
实现步骤
- 路径配置:在
src/main/resources目录下创建META-INF文件夹,再在该文件夹下创建persistence.xml文件,Maven编译时会自动将该文件加载到类路径下。 - 依赖配置:除了
org.eclipse.persistence.jpa和数据库驱动依赖外,还是需要添加上述排除了Hibernate的spring-boot-starter-data-jpa依赖,Maven会自动下载所有依赖包,无需额外操作。 - 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>
- 使用方式:配置完成后无需额外代码,直接通过
@PersistenceContext注入EntityManager即可操作带关联关系的实体,事务由Spring托管。
注意事项
- 配置persistence.xml后,就不需要再写
EclipseLinkJpaConfiguration配置类,两种配置二选一即可,避免冲突。 - 你当前pom中同时引入了MySQL和SQL Server两个驱动,按实际使用的数据库保留一个即可,避免不必要的冲突。
内容的提问来源于stack exchange,提问作者Isild
相关产品推荐
相关产品推荐

