升级Spring 3.2.2后实体[djob]未找到及空指针异常求助
问题分析与解决方案
升级到Hibernate 6.4.0.Final后出现的NullPointerException和内部MappingException: property [djob] not found on entity [com.xxx.JobsDeviceIds],根源是Hibernate 6.x对实体映射的校验规则更严格,结合你的@IdClass关联场景,主要有以下几个解决方向:
1. 确保实体类属性的Getter方法符合JavaBean规范
Hibernate依赖标准的JavaBean命名规则识别实体属性,检查JobsDeviceIds中djob字段的Getter方法是否为getDjob()(驼峰命名)。如果实体类未使用Lombok注解(如@Data),需手动编写符合规范的Getter/Setter方法,避免因方法命名错误导致Hibernate无法识别djob属性。
2. 添加@MapsId注解关联主键与关联字段
在@ManyToOne注解上添加@MapsId("jobid"),明确将关联字段djob映射到主键字段jobid,帮助Hibernate正确解析主键与关联关系,这是Hibernate 6.x处理@IdClass关联场景的推荐方式:
@Entity @Table(name = "JOBSDEVICEIDS") @IdClass(JobsDeviceIdsId.class) public class JobsDeviceIds implements Serializable { private static final long serialVersionUID = 1L; @Id private Integer jobid; @Id private Integer devicemasterid; @JsonBackReference @ManyToOne(fetch = FetchType.LAZY, optional = false) @JoinColumn(name = "jobid", nullable = false, insertable = false, updatable = false) @MapsId("jobid") // 明确关联主键字段jobid private Jobs djob; // 确保getDjob()、setDjob(Jobs jobs)等方法存在且命名规范 }
3. 验证IdClass的正确性
检查JobsDeviceIdsId类:
- 确保
jobid、devicemasterid的字段名和类型与实体类的主键字段完全一致 - 确认
@Data注解已正确生成equals()和hashCode()方法(Hibernate要求IdClass必须正确实现这两个方法)
4. 清理编译缓存
升级框架后,旧的编译缓存可能导致映射异常,清理项目的target/build目录,重新编译打包,确保使用最新的类文件。
内容的提问来源于stack exchange,提问作者sumit huria
相关产品推荐
相关产品推荐

