You need to enable JavaScript to run this app. Hibernate 5插入实体抛出PropertyAccessException无法访问字段怎么解决
优惠活动
大模型
产品
解决方案
定价
更多

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.*

其他潜在问题修复

  1. 枚举类语法优化:你的AppUserRole枚举最后一个元素后多余的逗号可能引发低版本JDK/Hibernate的兼容问题,修改为:
package com.duan1.entity;
        
public enum AppUserRole {
    USER,
    ADMIN
}
  1. Spring Boot环境简化配置:Spring Boot已经自动完成Hibernate/SessionFactory的初始化,不需要自己手写HibernateUtils工具类管理SessionFactory,直接在需要使用的类中注入SessionFactory即可,避免手动初始化的配置和Spring上下文冲突。

内容的提问来源于stack exchange,提问作者sitien147

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.11 16:06:02