JavaFX 14集成JPA(EclipseLink)运行报错找不到有效Persistence Provider
解决方案
核心问题原因
Java模块系统(JPMS)下服务发现机制受限,JPA无法自动扫描到EclipseLink的持久化提供器实现,同时缺少必要的模块开放声明和依赖配置。
修复步骤
- 补全pom.xml依赖
你当前pom未显式声明jakarta.persistence和mysql-connector依赖,新增如下配置:
<!-- 新增内容 --> <dependency> <groupId>jakarta.persistence</groupId> <artifactId>jakarta.persistence-api</artifactId> <version>2.2.3</version> </dependency> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>8.0.20</version> </dependency>
- 修改module-info.java配置
新增JPA服务发现声明,同时开放实体类所在包给EclipseLink做反射访问:
module das.sad { requires javafx.controls; requires javafx.fxml; requires org.controlsfx.controls; requires com.dlsc.formsfx; requires org.kordamp.bootstrapfx.core; requires mysql.connector.java; requires java.persistence; requires eclipselink; // 新增:声明JPA服务接口,支持模块系统下的服务发现 uses javax.persistence.spi.PersistenceProvider; // 调整:新增开放给eclipselink的权限,实体类在子包的话修改为对应包路径 opens das.sad to javafx.fxml, eclipselink; exports das.sad; }
- 补全persistence.xml配置
显式指定持久化提供器,避免自动扫描失败,同时添加实体类扫描配置:
<persistence-unit name="LOL" transaction-type="RESOURCE_LOCAL"> <!-- 新增:显式指定EclipseLink持久化提供器 --> <provider>org.eclipse.persistence.jpa.PersistenceProvider</provider> <!-- 新增:列全所有JPA实体类,多个实体就加多个<class>标签 --> <class>das.sad.替换为你的实体类名</class> <!-- 原有数据库连接、方言等配置保持不变 --> <properties> <!-- 新增:强制EclipseLink在模块环境下扫描实体 --> <property name="eclipselink.archive.factory" value="org.eclipse.persistence.internal.jpa.ArchiveFactoryImpl"/> <!-- 原有mysql连接地址、用户名、密码、驱动类等配置保留 --> </properties> </persistence-unit>
- 确认配置文件路径
确保persistence.xml放在src/main/resources/META-INF/目录下,编译后该文件会出现在classes/META-INF路径中。
备选方案(可选)
如果不想调整模块配置,可直接删除module-info.java,切换到classpath模式运行,即可避开模块系统的服务发现限制。
内容的提问来源于stack exchange,提问作者Bastimon
相关产品推荐
相关产品推荐

