Spring Boot 3.0迁移后Hibernate LAZY加载失效致用户删除失败
Spring Boot 3.0迁移后用户删除功能异常及关联属性加载问题
迁移至Spring Boot 3.0后,集成测试显示用户删除功能无法正常工作。排查发现:加载User对象时,其中一个关联属性无法被加载,只有将该属性设为EAGER抓取才能正常加载;此时删除用户会失败,因为数据库中仍存在引用该用户的关联记录。
两个关联属性的配置方式看似完全一致,但表现截然不同,具体代码如下:
User实体代码
@Entity @Data @Table(name = "user_model") public class User extends BaseEntity { @Id @GeneratedValue(generator = "system-uuid") @GenericGenerator(name = "system-uuid", strategy = "uuid") private String id; ... @OneToOne(fetch = FetchType.LAZY, mappedBy = "user", cascade = CascadeType.ALL, orphanRemoval = true) private UserSettings userSettings; @OneToOne(fetch = FetchType.LAZY, mappedBy = "user", cascade = CascadeType.ALL, orphanRemoval = true) private UserTermsOfUse userTermsOfUse; ... }
可正常加载的UserTermsOfUse实体代码
@Entity @Table(name = "user_termsofuse") @Data public class UserTermsOfUse extends BaseEntity { @Id @GeneratedValue(generator = "system-uuid") @GenericGenerator(name = "system-uuid", strategy = "uuid") private String id; @OneToOne(fetch = FetchType.EAGER, cascade = CascadeType.ALL) @JoinColumn(name = "user_id", referencedColumnName = "id") @ToString.Exclude private User user; @Column(name = "accepted_termsofuse") private String acceptedTermsOfUse; }
无法加载的UserSettings实体代码
@Entity @Table(name = "user_settings") @Data public class UserSettings extends BaseEntity { @Id @GeneratedValue(generator = "system-uuid") @GenericGenerator(name = "system-uuid", strategy = "uuid") private String id; @OneToOne(fetch = FetchType.EAGER, cascade = CascadeType.ALL) @JoinColumn(name = "user_id", referencedColumnName = "id") @ToString.Exclude private User user; private String language; private String lastActiveClientId; }
数据库中确实存在对应用户的UserSettings记录,但通过ID加载User实体时,仅能看到UserTermsOfUse属性,UserSettings属性为null,访问该属性时会触发NullPointerException。
内容的提问来源于stack exchange,提问作者kism3t
相关产品推荐
相关产品推荐

