JavaFX集成Hibernate创建EntityManagerFactory时报模块访问错误如何解决
问题原因
该错误是Java 9+模块化系统(JPMS)的权限限制导致:Hibernate需要为你的实体类动态生成代理类,代理类要实现的org.hibernate.proxy.ProxyConfiguration接口存放在未命名模块中,而你声明的org.application模块默认没有读取未命名模块类的权限,因此触发访问错误。
解决方案
方案1:修改module-info.java配置(优先推荐)
在项目的module-info.java文件中添加以下配置,原有JavaFX、依赖导出等配置保留即可:
module org.application { // 原有JavaFX相关依赖 requires javafx.controls; requires javafx.fxml; // 持久化相关依赖 requires java.persistence; requires org.hibernate.orm.core; // 允许当前模块读取未命名模块的类 requires static unnamed; // 开放实体类所在包给Hibernate,允许反射访问和代理生成 // 替换成你自己的实体类所在包路径 opens org.application to org.hibernate.orm.core, java.persistence; opens org.application.entity to org.hibernate.orm.core, java.persistence; // 原有导出配置保留 exports org.application; }
方案2:添加JVM启动参数
如果修改模块描述符后仍报错,可在IDE运行配置中添加如下JVM参数,显式授权模块读取未命名模块:
--add-reads org.application=ALL-UNNAMED
如果使用Maven的javafx插件运行,可在插件配置中添加参数:
<plugin> <groupId>org.openjfx</groupId> <artifactId>javafx-maven-plugin</artifactId> <version>0.0.8</version> <configuration> <mainClass>org.application/org.application.App</mainClass> <options> <option>--add-reads org.application=ALL-UNNAMED</option> </options> </configuration> </plugin>
校验项
- 确认所有实体类都存在public无参构造方法,这是Hibernate生成代理的必要前提
- 确认Hibernate与ByteBuddy依赖版本匹配,无版本冲突问题
内容的提问来源于stack exchange,提问作者onlu174
相关产品推荐
相关产品推荐

