JPA双向关联存储问题:authority表user_id字段为null原因排查
实体类定义
public class AuthorityEntity { @Id @GeneratedValue(strategy= GenerationType.AUTO,generator="native") @GenericGenerator(name = "native",strategy = "native") @Column(name="authority_id") private Long id; private String role; @ManyToOne @JoinColumn(name="user_id") private UserEntity user; } public class UserEntity { @Id @GeneratedValue(strategy = GenerationType.AUTO, generator = "native") @GenericGenerator(name = "native", strategy = "native") @Column(name="user_id") private Long id; private String email; private String pwd; @JsonIgnore @OneToMany(mappedBy="user",cascade = CascadeType.ALL) private Set<AuthorityEntity> authorities; }
服务层代码
public String joinService(UserEntity userInfo) { try { Set<AuthorityEntity> setAuthority = new HashSet<>(); setAuthority.add(AuthorityEntity.builder().role("AICALL").build()); UserEntity user = UserEntity.builder() .email(userInfo.getEmail()) .pwd(passwordEncoder.encode(userInfo.getPwd())) .authorities(setAuthority) .build(); userRepository.save(user); } catch (Exception ex) { } return "ok"; }
问题原因及修复方案
核心原因
在JPA双向关联中,关联关系的维护权由拥有@ManyToOne注解的一方(即外键所在的AuthorityEntity)掌控。UserEntity上的@OneToMany(mappedBy="user")明确指定:这个一对多关联是由AuthorityEntity中的user属性来维护的。
当前代码仅给UserEntity设置了authorities集合,但未给每个AuthorityEntity实例绑定对应的user属性。Hibernate无法自动推断关联的用户对象,因此会将authority表的user_id字段设为null。
修复方法
需要在构建AuthorityEntity时,将其与创建的UserEntity关联,示例代码如下:
public String joinService(UserEntity userInfo) { try { // 先构建User对象 UserEntity user = UserEntity.builder() .email(userInfo.getEmail()) .pwd(passwordEncoder.encode(userInfo.getPwd())) .build(); // 构建Authority并绑定当前User Set<AuthorityEntity> setAuthority = new HashSet<>(); AuthorityEntity authority = AuthorityEntity.builder() .role("AICALL") .user(user) // 关键:设置关联的User对象 .build(); setAuthority.add(authority); // 给User设置权限集合 user.setAuthorities(setAuthority); userRepository.save(user); } catch (Exception ex) { ex.printStackTrace(); } return "ok"; }
这样保存时,Hibernate会通过AuthorityEntity的user属性,正确填充authority表的user_id字段。
内容的提问来源于stack exchange,提问作者위성구
相关产品推荐
相关产品推荐

