JavaFX整合Hibernate持久化数据时触发Inaccessible Object Exception问题
Hibernate + JavaFX 持久化报错:Inaccessible Object Exception 解决
问题描述
用Hibernate+JavaFX开发保险管理程序,持久化SystemAdmin对象到PostgreSQL时触发Inaccessible Object Exception,无法构建SessionFactory,核心报错:
module org.example.insurancemanagementapplication does not "opens Entity" to unnamed module @7920ba90
相同代码在非JavaFX项目中正常运行,仅JavaFX项目出现此问题。
原因
JavaFX项目默认启用JPMS(Java平台模块系统),Hibernate这类ORM框架依赖反射访问实体类的私有成员,但模块系统默认封闭内部包。Hibernate属于未命名模块(unnamed module),无法访问你的模块中Entity包的类,导致权限错误;非JavaFX项目一般不启用模块系统,反射不受限制,所以正常运行。
解决方法
1. 修改module-info.java开放包权限
在项目的module-info.java中,添加对Hibernate模块的包开放声明,允许反射访问:
module org.example.insurancemanagementapplication { // 开放Entity包给Hibernate模块 opens Entity to org.hibernate.orm.core; // 可选:对外暴露Entity包(如需其他模块访问) exports Entity; // 声明必要依赖 requires javafx.controls; requires javafx.fxml; requires org.hibernate.orm.core; requires java.persistence; requires java.sql; }
注意:旧版Hibernate可能需要写
opens Entity to hibernate-core,根据实际依赖模块名调整。
2. 禁用模块系统(临时快速方案)
如果不需要模块系统,可以关闭JPMS:
- IntelliJ IDEA:
File > Project Structure > Modules,取消勾选Enable module-info.java - Maven/Gradle:移除
module-info.java相关配置,让项目以传统类路径运行。
3. 使用Hibernate字节码增强(进阶方案)
通过编译期字节码增强生成访问器,规避运行时反射权限问题。Maven配置示例:
<build> <plugins> <plugin> <groupId>org.hibernate.orm.tooling</groupId> <artifactId>hibernate-enhance-maven-plugin</artifactId> <version>${hibernate.version}</version> <executions> <execution> <phase>process-classes</phase> <goals> <goal>enhance</goal> </goals> </execution> </executions> </plugin> </plugins> </build>
此方案无需额外开放包权限,但需确保module-info.java正确声明依赖。
内容的提问来源于stack exchange,提问作者user24694032
相关产品推荐
相关产品推荐

