Hibernate 5插入实体抛出PropertyAccessException无法访问字段怎么解决
报错原因分析
你遇到的这个异常本质不是address字段为null导致的,从报错栈的AppUser(id=null, username=abc, ... address=ABCD...)可以看到你插入的实例address字段已经赋值,异常的真实原因是类加载器类型不匹配,配合你的Spring Boot + DevTools环境,具体成因和修复方案如下:
核心原因:Spring Boot DevTools 类加载器冲突
Spring Boot DevTools为了实现热重启能力,会拆分使用两个类加载器:
- 基础类加载器:加载第三方依赖包(比如Hibernate、Spring核心包)
- 重启类加载器:加载你项目中自己编写的业务类(比如
AppUser实体、HibernateUtils工具类)
Hibernate是被基础类加载器加载的,它扫描实体时也会用基础类加载器加载AppUser类;而你代码里new AppUser()生成的实例是重启类加载器加载的,JVM会判定两个全限定名相同但类加载器不同的类为不同类型,Hibernate反射读取字段时因为类型不匹配,抛出了语义模糊的"无法给字段赋值null"错误。
修复方案
方案1:禁用DevTools(快速验证)
如果不需要热重启功能,直接在application.properties配置文件中添加以下配置,重启项目即可解决:
spring.devtools.restart.enabled=false
方案2:配置DevTools类加载规则(保留热重启)
如果需要保留DevTools的热重启能力,在项目resources/META-INF目录下新建spring-devtools.properties文件,添加以下配置,将实体类、Hibernate工具类纳入基础类加载器加载范围:
restart.include.entity=com.duan1.entity.* restart.include.utils=com.duan1.utils.*
其他潜在问题修复
- 枚举类语法优化:你的
AppUserRole枚举最后一个元素后多余的逗号可能引发低版本JDK/Hibernate的兼容问题,修改为:
package com.duan1.entity; public enum AppUserRole { USER, ADMIN }
- Spring Boot环境简化配置:Spring Boot已经自动完成Hibernate/SessionFactory的初始化,不需要自己手写
HibernateUtils工具类管理SessionFactory,直接在需要使用的类中注入SessionFactory即可,避免手动初始化的配置和Spring上下文冲突。
内容的提问来源于stack exchange,提问作者sitien147
相关产品推荐
相关产品推荐

