JavaFX应用接入JPA时EntityManager初始化抛出类未找到异常求解
问题描述
我在JavaFX FXML应用中接入EntityManager时遇到报错,目前已完成数据表到Model层实体类的导入,在尝试向实体插入数据时抛出异常,相关代码、配置和报错信息如下:
主类代码
package com.example.systemzarzadzaniahurtownia; import javafx.application.Application; import javafx.fxml.FXMLLoader; import javafx.scene.Parent; import javafx.scene.Scene; import javafx.stage.Stage; import javax.persistence.EntityManager; import javax.persistence.EntityManagerFactory; import javax.persistence.Persistence; import java.io.IOException; public class Main extends Application { private static EntityManagerFactory factory = Persistence.createEntityManagerFactory("thePersistenceUnit"); private static EntityManager em = factory.createEntityManager(); @Override public void start(Stage stage) throws IOException { Parent root = FXMLLoader.load(getClass().getResource("/fxml/Home.fxml")); stage.setResizable(false); Scene scene = new Scene(root); stage.setScene(scene); stage.show(); } public static void main(String[] args) { launch(args); } }
错误信息
Exception in thread "main" java.lang.reflect.InvocationTargetException at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77) at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) at java.base/java.lang.reflect.Method.invoke(Method.java:568) at java.base/sun.launcher.LauncherHelper$FXHelper.main(LauncherHelper.java:1071) Caused by: java.lang.NoClassDefFoundError: java/sql/SQLException at java.base/java.lang.Class.forName0(Native Method) at java.base/java.lang.Class.forName(Class.java:467) at org.jboss.logging.Logger.doGetMessageLogger(Logger.java:2562) at org.jboss.logging.Logger.getMessageLogger(Logger.java:2530) at org.jboss.logging.Logger.getMessageLogger(Logger.java:2516) at org.hibernate.orm.core@5.6.1.Final/org.hibernate.internal.HEMLogging.messageLogger(HEMLogging.java:28) at org.hibernate.orm.core@5.6.1.Final/org.hibernate.internal.HEMLogging.messageLogger(HEMLogging.java:24) at org.hibernate.orm.core@5.6.1.Final/org.hibernate.jpa.boot.internal.PersistenceXmlParser.<clinit>(PersistenceXmlParser.java:54) at org.hibernate.orm.core@5.6.1.Final/org.hibernate.jpa.HibernatePersistenceProvider.getEntityManagerFactoryBuilderOrNull(HibernatePersistenceProvider.java:81) at org.hibernate.orm.core@5.6.1.Final/org.hibernate.jpa.HibernatePersistenceProvider.getEntityManagerFactoryBuilderOrNull(HibernatePersistenceProvider.java:61) at org.hibernate.orm.core@5.6.1.Final/org.hibernate.jpa.HibernatePersistenceProvider.createEntityManagerFactory(HibernatePersistenceProvider.java:50) at java.persistence@2.2/javax.persistence.Persistence.createEntityManagerFactory(Persistence.java:79) at java.persistence@2.2/javax.persistence.Persistence.createEntityManagerFactory(Persistence.java:54) at com.example.systemzarzadzaniamagazynem/com.example.systemzarzadzaniahurtownia.Main.<clinit>(Main.java:14) at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77) at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) at java.base/java.lang.reflect.Method.invoke(Method.java:568) at javafx.graphics/com.sun.javafx.application.LauncherImpl.launchApplicationWithArgs(LauncherImpl.java:467) at javafx.graphics/com.sun.javafx.application.LauncherImpl.launchApplication(LauncherImpl.java:366) ... 5 more Caused by: java.lang.ClassNotFoundException: java.sql.SQLException at java.base/jdk.internal.loader.BuiltinClassLoader.loadClass(BuiltinClassLoader.java:641) at java.base/jdk.internal.loader.ClassLoaders$AppClassLoader.loadClass(ClassLoaders.java:188) at java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:520) ... 25 more
persistence.xml配置
<?xml version="1.0" encoding="UTF-8" ?> <persistence 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_1_0.xsd" version="1.0"> <persistence-unit name="thePersistenceUnit" transaction-type="RESOURCE_LOCAL"> <class>Entity.Dostawcy</class> <class>Entity.DostawyId</class> <class>Entity.Dostawy</class> <class>Entity.DostawyId</class> <class>Entity.Dostawy</class> <class>Entity.Kategorie</class> <class>Entity.Klienci</class> <class>Entity.Towary</class> <class>Entity.Zamowienia</class> <class>Entity.ZamWieniaTowaruId</class> <class>Entity.ZamWieniaTowaru</class> <class>Entity.DostawyId</class> <class>Entity.Dostawy</class> <provider>org.hibernate.jpa.HibernatePersistenceProvider</provider> <properties> <property name="javax.persistence.jdbc.driver" value="com.mysql.jdbc.Driver" /> <property name="javax.persistence.jdbc.url" value="jdbc:mysql://localhost/hurtownia" /> <property name="javax.persistence.jdbc.user" value="root" /> <property name="javax.persistence.jdbc.password" value="" /> <property name="hibernate.dialect" value="org.hibernate.dialect.MySQL8Dialect" /> <property name="hibernate.use_sql_comments" value="true" /> <property name="hibernate.show_sql" value="true" /> <property name="hibernate.hbm2ddl.auto" value="create" /> </properties> </persistence-unit> </persistence>
问题原因与解决方案
报错核心为无法找到java.sql.SQLException类,该问题是Java 9+模块化系统(JPMS)的常见问题,你项目的module-info.java未声明java.sql模块依赖,导致Hibernate运行时无法加载SQL相关基础类。
可按以下步骤修复:
- 打开项目根目录的
module-info.java,补全依赖声明与开放权限:
module com.example.systemzarzadzaniahurtownia { requires javafx.controls; requires javafx.fxml; // 新增SQL模块依赖 requires java.sql; requires javax.persistence; requires org.hibernate.orm.core; // 开放实体类包给Hibernate反射访问 opens Entity to org.hibernate.orm.core; opens com.example.systemzarzadzaniahurtownia to javafx.fxml; exports com.example.systemzarzadzaniahurtownia; }
- 调整持久化单元初始化时机,避免类加载阶段就初始化JPA导致启动异常,同时补充资源释放逻辑:
public class Main extends Application { private EntityManagerFactory factory; private EntityManager em; @Override public void start(Stage stage) throws IOException { // 移到start方法内初始化 factory = Persistence.createEntityManagerFactory("thePersistenceUnit"); em = factory.createEntityManager(); Parent root = FXMLLoader.load(getClass().getResource("/fxml/Home.fxml")); stage.setResizable(false); Scene scene = new Scene(root); stage.setScene(scene); stage.show(); // 窗口关闭时释放JPA资源 stage.setOnCloseRequest(event -> { em.close(); factory.close(); }); } public static void main(String[] args) { launch(args); } }
- 清理persistence.xml中重复的实体类声明,你重复注册了多次
Dostawy和DostawyId,删除多余条目即可。
内容的提问来源于stack exchange,提问作者Radosław
相关产品推荐
相关产品推荐

