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
相关产品推荐
相关产品推荐

