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

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相关基础类。
可按以下步骤修复:

  1. 打开项目根目录的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;
}
  1. 调整持久化单元初始化时机,避免类加载阶段就初始化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);
   }
}
  1. 清理persistence.xml中重复的实体类声明,你重复注册了多次Dostawy和DostawyId,删除多余条目即可。

内容的提问来源于stack exchange,提问作者Radosław

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.25 16:15:07