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

JavaFX+JPA+Hibernate项目初始化遇Unable to locate persister错误求助

集成JavaFX、Hibernate与JPA时遇到「Unable to locate persister」错误

我正在开发一个集成JavaFX、Hibernate和JPA的项目,遇到了「Unable to locate persister: com.example.demo.Resident」错误。一开始以为是没把实体类加入配置文件,现在已经添加了实体类,但问题还是没解决。下面是我的配置文件和堆栈跟踪信息:

hibernate.cfg.xml 文件

<?xml version='1.0' encoding='utf-8'?>
<!DOCTYPE hibernate-configuration PUBLIC
        "-//Hibernate/Hibernate Configuration DTD//EN"
        "http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd">
<hibernate-configuration>
    <session-factory>
        <property name="connection.url">jdbc:mysql://localhost:3306/test_schema</property>
        <property name="connection.driver_class">com.mysql.cj.jdbc.Driver</property>
        <property name="connection.username">root</property>
        <property name="connection.password">password</property>

        <!-- DB schema will be updated if needed -->
        <property name="hibernate.hbm2ddl.auto">update</property>
        <property name="dialect">org.hibernate.dialect.MySQLDialect</property>
        <property name="show_sql">true</property>
        <mapping class="com.example.demo.Resident"/>
    </session-factory>
</hibernate-configuration>

persistence.xml 文件

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<persistence xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
             xmlns="https://jakarta.ee/xml/ns/persistence"
             xsi:schemaLocation="https://jakarta.ee/xml/ns/persistence https://jakarta.ee/xml/ns/persistence/persistence_3_0.xsd"
             version="3.0">
    <persistence-unit name="default">
        <class>com.example.demo.Resident</class>
        <properties>
            <property name="jakarta.persistence.jdbc.driver" value="com.mysql.cj.jdbc.Driver"/>
            <property name="jakarta.persistence.jdbc.url" value="jdbc:mysql://localhost:3306/test_schema"/>
            <property name="jakarta.persistence.jdbc.user" value="root"/>
            <property name="jakarta.persistence.jdbc.password" value="giao256.getMySQL"/>
            <property name="jakarta.persistence.schema-generation.database.action" value="drop-and-create"/>
            <property name="jakarta.persistence.schema-generation.create-source" value="metadata"/>
        </properties>
    </persistence-unit>
</persistence>

module-info.java 文件

module com.example.demo {
    requires jakarta.persistence;
    requires lombok;
    requires javafx.fxml;
    requires javafx.graphics;
    requires javafx.controls;
    requires org.hibernate.orm.core;
    requires java.naming;

    opens com.example.demo to javafx.fxml;
    exports com.example.demo;
}

Resident是带有@Entity、@Id等注解的标准实体类。

堆栈跟踪信息

Exception in Application start method
java.lang.reflect.InvocationTargetException
    at java.base/jdk.internal.reflect.DirectMethodHandleAccessor.invoke(DirectMethodHandleAccessor.java:118)
    at java.base/java.lang.reflect.Method.invoke(Method.java:580)
    at javafx.graphics@21/com.sun.javafx.application.LauncherImpl.launchApplicationWithArgs(LauncherImpl.java:464)
    at javafx.graphics@21/com.sun.javafx.application.LauncherImpl.launchApplication(LauncherImpl.java:364)
    at java.base/jdk.internal.reflect.DirectMethodHandleAccessor.invoke(DirectMethodHandleAccessor.java:103)
    at java.base/java.lang.reflect.Method.invoke(Method.java:580)
    at java.base/sun.launcher.LauncherHelper$FXHelper.main(LauncherHelper.java:1135)
Caused by: java.lang.RuntimeException: Exception in Application start method
    at javafx.graphics@21/com.sun.javafx.application.LauncherImpl.launchApplication1(LauncherImpl.java:893)
    at javafx.graphics@21/com.sun.javafx.application.LauncherImpl.lambda$launchApplication$2(LauncherImpl.java:196)
    at java.base/java.lang.Thread.run(Thread.java:1583)
Caused by: java.lang.IllegalArgumentException: Unable to locate persister: com.example.demo.Resident
    at org.hibernate.orm.core@6.2.4.Final/org.hibernate.internal.SessionImpl.firePersist(SessionImpl.java:758)
    at org.hibernate.orm.core@6.2.4.Final/org.hibernate.internal.SessionImpl.persist(SessionImpl.java:739)
    at com.example.demo/com.example.demo.DemoApplication.start(DemoApplication.java:25)
    at javafx.graphics@21/com.sun.javafx.application.LauncherImpl.lambda$launchApplication1$9(LauncherImpl.java:839)
    at javafx.graphics@21/com.sun.javafx.application.PlatformImpl.lambda$runAndWait$12(PlatformImpl.java:483)
    at javafx.graphics@21/com.sun.javafx.application.PlatformImpl.lambda$runLater$10(PlatformImpl.java:456)
    at java.base/java.security.AccessController.doPrivileged(AccessController.java:400)
    at javafx.graphics@21/com.sun.javafx.application.PlatformImpl.lambda$runLater$11(PlatformImpl.java:455)
    at javafx.graphics@21/com.sun.glass.ui.InvokeLaterDispatcher$Future.run(InvokeLaterDispatcher.java:95)
    at javafx.graphics@21/com.sun.glass.ui.win.WinApplication._runLoop(Native Method)
    at javafx.graphics@21/com.sun.glass.ui.win.WinApplication.lambda$runLoop$3(WinApplication.java:185)
    ... 1 more
Exception running application com.example.demo.DemoApplication

解决步骤

1. 向Hibernate开放实体类模块

在Java模块系统中,Hibernate需要通过反射访问实体类的字段和方法,必须显式开放实体类所在包给Hibernate。修改module-info.java,添加对org.hibernate.orm.core的开放:

module com.example.demo {
    requires jakarta.persistence;
    requires lombok;
    requires javafx.fxml;
    requires javafx.graphics;
    requires javafx.controls;
    requires org.hibernate.orm.core;
    requires java.naming;

    opens com.example.demo to javafx.fxml, org.hibernate.orm.core;
    exports com.example.demo;
}

2. 统一配置文件,避免冲突

你同时使用了hibernate.cfg.xml和persistence.xml,这会导致配置混乱,建议二选一:

  • 若使用JPA EntityManager,保留persistence.xml,删除hibernate.cfg.xml;
  • 若直接使用Hibernate SessionFactory,保留hibernate.cfg.xml,删除persistence.xml。

另外注意两个配置文件中的数据库密码不一致,统一为正确的密码,避免数据库连接失败。

3. 验证实体类的完整性

确保Resident类满足以下要求:

  • 类上标注@Entity注解;
  • 主键字段标注@Id,自增主键需额外添加@GeneratedValue(strategy = GenerationType.IDENTITY);
  • 存在公共无参构造方法(可通过Lombok的@NoArgsConstructor生成);
  • 字段的访问权限或Getter/Setter方法符合JPA规范。

4. 检查依赖兼容性

Hibernate 6.2.4适配Jakarta Persistence 3.0,确保项目中没有混入旧版JPA(javax.persistence)的依赖,所有相关依赖版本保持一致。

内容的提问来源于stack exchange,提问作者Giao Le Xuan

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.09 04:40:00