eclipselink适配华为云&Gaussdb

举报
yd_243587097 发表于 2024/12/03 11:15:19 2024/12/03
【摘要】 介绍eclipselink适配华为云步骤及遇到问题和解决方案

前一阵,适配了Mybatis(https://bbs.huaweicloud.com/blogs/437134)。在华为云开源共创平台,还有一些组件, 今天就来适配eclipselink

任务的目的

因为华为云采用了自己的cpu指令集和操作系统,所以可能有些软件不适配。所以诞生了此次任务。我领取的任务就是新建一个使用eclipselink的项目,在华为云上部署,看看适配能够正常运行。

报名流程

  1. 在喜欢的任务上进行报名,填写自己的申请,留下自己的邮箱,之后华为官方会发送任务计划书到邮箱内。
  2. 开通开发者空间,进行实名认证,加入沃土云创计划个人方向。
  3. 进入激励管理》开源共创,进入任务,此时在需求分析节点,提交之前发送到邮箱内的任务计划书。
  4. 提交任务计划书之后,审批后进入开发阶段,阅读任务计划书,了解需要开发的内容。
  5. 此时需要申领服务器,主要是Gaussdb,华为云ECS。
  6. 开发完整之后,在ECS上进行验证。
  7. 测试完成后,可以申请任务验收。将自己的代码分支博文等信息打包成zip文件进行上传。

开发代码

  • 华为云提供了官方demo(https://gitcode.com/HuaweiCloudDeveloper/servicecomb-fence/overview),首先在自己的账号下导入仓库。
  • 现在这个项目是在Mybatis上改的,一些基础的类,例如student已经存在了。所以就不需要再写了
  • 我的项目https://gitcode.com/wsm921225/opensource-demo-eclipselink-241107/overview ,分支dev_eclipse_last
使用 EclipseLink 和 Spring Data JPA 集成的常见问题及解决方案

在使用 EclipseLink 作为 JPA 提供者,结合 Spring Boot 和 Spring Data JPA 时,很多开发者会遇到诸如“实体未找到”或“类不兼容”的问题。这篇博客将结合实际报错案例进行分析,帮助大家更好地理解这些问题的原因和解决方案。

一、背景介绍

EclipseLink 是一个功能强大的 JPA 提供者,常用于替代 Hibernate。虽然 EclipseLink 提供了与 JPA 标准的兼容性,但在实际项目中集成 Spring Boot 和 Spring Data JPA 时,可能会因为版本不兼容、配置错误等问题导致一些异常。

我们以一个简单的 Student 实体和 StudentRepository 为例,探讨如何解决常见的集成问题。

二、常见报错及原因分析

1. 实体未找到错误

报错信息:

Caused by: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'studentRepository': No [ManagedType] was found for the key class [org.apache.servicecomb.fence.resource.Student] in the Metamodel

原因分析:

• Student 类虽然标注了 @Entity 注解,但 EclipseLink 无法扫描到它。

• 可能的原因包括包路径未被扫描、未正确配置实体扫描等。

2. PersistenceProvider 接口不兼容错误

报错信息:

Caused by: java.lang.IncompatibleClassChangeError: Class org.eclipse.persistence.jpa.PersistenceProvider does not implement the requested interface jakarta.persistence.spi.PersistenceProvider

原因分析:

• 这是由于 jakarta.persistence 和 javax.persistence 版本混用导致的类加载冲突。

• Spring Boot 默认使用 Hibernate,可能存在 JPA 版本不匹配问题。

三、问题解决方案

1. 配置正确的实体扫描路径

确保 Spring Boot 能扫描到 Student 类所在的包路径。可以使用 @EntityScan 和 @EnableJpaRepositories 注解显式声明路径:

@Configuration

@EnableJpaRepositories(basePackages = "org.apache.servicecomb.fence.resource")

@EntityScan(basePackages = "org.apache.servicecomb.fence.resource")

public class CustomJpaConfiguration {
}

• @EnableJpaRepositories 指定 StudentRepository 所在包路径。

• @EntityScan 指定 Student 类所在包路径。

2. 检查 Student 实体类

确保 Student 类标注了正确的注解,并使用了兼容的导包方式:

package org.apache.servicecomb.fence.resource;
import jakarta.persistence.Entity;
import jakarta.persistence.Id;
@Entity
public class Student {
    @Id
    private Long id;
    private String name;
    // Getter 和 Setter
}

注意:

确保 @Entity 和 @Id 注解的包名是 jakarta.persistence,而不是混用 javax.persistence。

3. 修改 persistence.xml 配置(可选)

如果仍然使用 persistence.xml,确保该文件在 resources/META-INF 目录下,并正确声明实体类:

<persistence xmlns="https://jakarta.ee/xml/ns/persistence"
             version="3.0">
    <persistence-unit name="default">
        <class>org.apache.servicecomb.fence.resource.Student</class>
    </persistence-unit>
</persistence>

4. 确保依赖版本兼容

在 pom.xml 中明确引入 EclipseLink 及 JPA 依赖,并排除 Hibernate 相关依赖:

<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>
        <exclusion>
          <groupId>org.hibernate</groupId>
          <artifactId>hibernate-entitymanager</artifactId>
        </exclusion>
        <exclusion>
          <groupId>org.apache.logging.log4j</groupId>
          <artifactId>log4j-to-slf4j</artifactId>
        </exclusion>
        <exclusion>
          <artifactId>spring-boot-starter-logging</artifactId>
          <groupId>org.springframework.boot</groupId>
        </exclusion>
      </exclusions>
    </dependency>
    <dependency>
      <groupId>org.eclipse.persistence</groupId>
      <artifactId>org.eclipse.persistence.jpa</artifactId>
      <version>${eclipselink.version}</version>
    </dependency>
    <dependency>
      <groupId>org.eclipse.persistence</groupId>
      <artifactId>eclipselink</artifactId>
      <version>${eclipselink.version}</version> <!-- 替换为最新稳定版本 -->
    </dependency>
    <dependency>
      <groupId>com.huawei</groupId>
      <artifactId>gsjdbc4</artifactId>
      <version>1.0</version>
    </dependency>
注意:

eclipselink.version 应与 JPA 版本匹配。如果使用 jakarta.persistence,确保使用 EclipseLink 3.x 版本。

5. 配置 EclipseLink 专属参数

在 application.yml 中添加 EclipseLink 的相关配置:

spring:
  jpa:
    properties:
      eclipselink.ddl-generation: create-tables
      eclipselink.weaving: false
    show-sql: true

• ddl-generation:设置数据库表的DDL生成策略。

• weaving:禁用静态织入,避免类加载问题。

6. 清理项目缓存并重启

确保项目没有缓存残留,可以执行以下命令清理并重新编译:

mvn clean install

四、完整示例代码

1. 实体类 Student

package org.apache.servicecomb.fence.resource;
import jakarta.persistence.Entity;
import jakarta.persistence.Id;
@Entity
public class Student {
    @Id
    private Long id;
    private String name;
    // Getter 和 Setter
}

2. 仓库接口 StudentRepository

package org.apache.servicecomb.fence.resource;
import org.springframework.data.jpa.repository.JpaRepository;
public interface StudentRepository extends JpaRepository<Student, Long> {
}

3. Spring 配置类 CustomJpaConfiguration

import org.springframework.boot.autoconfigure.domain.EntityScan;
import org.springframework.context.annotation.Configuration;
import org.springframework.data.jpa.repository.config.EnableJpaRepositories;
@Configuration
@EnableJpaRepositories(basePackages = "org.apache.servicecomb.fence.resource")
@EntityScan(basePackages = "org.apache.servicecomb.fence.resource")
public class CustomJpaConfiguration {
}

4. Spring Boot 主类

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication
public class Application {
    public static void main(String[] args) {
        SpringApplication.run(Application.class, args);
    }
}

五、总结

1. 确认 @EntityScan 和 @EnableJpaRepositories 配置路径正确。

2. 检查 Student 类是否使用了正确的 @Entity 注解。

3. 使用与 EclipseLink 版本兼容的 JPA 版本。

4. 清理缓存并重新编译项目。

通过以上步骤,可以有效解决 EclipseLink 与 Spring Data JPA 集成中的常见问题。如果你仍然遇到其他问题,建议启用调试日志来定位问题根源。希望本文能为大家在实际项目开发中提供帮助。


上云第一步-购买Gaussdb

第二步-购买ECS

    成果访问

    访问 http://公网ip/ui/admin/  点击登录按钮后,页面显示如下

    现在的demo已经集成了接口测试,直接测试就行

    自此,成功完成eclipselink对接华为云的任务。

    【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
    • 点赞
    • 收藏
    • 关注作者

    评论(0

    0/1000
    抱歉,系统识别当前为高风险访问,暂不支持该操作

    全部回复

    上滑加载中

    设置昵称

    在此一键设置昵称,即可参与社区互动!

    *长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

    *长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。