Spring Data JPA+Postgres 一对一关联映射插入数据报IdentifierGenerationException错误
问题根因与解决方案
错误根因
你遇到的org.hibernate.id.IdentifierGenerationException: attempted to assign id from null one-to-one property异常由两个问题共同导致:
- UserInfo实体类的OneToOne关联注解配置错误
- 插入数据时未正确维护双向关联的引用关系,导致AddressInfo的@MapsId注解无法从关联的UserInfo实例中获取主键值
具体修改步骤
1. 修正UserInfo的关联注解配置
你在UserInfo的关联属性上错误添加了@PrimaryKeyJoinColumn,该注解属于关联关系维护端(也就是AddressInfo),而UserInfo作为mappedBy指定的被控端,不需要加这个注解,删除即可。
修改后UserInfo的关联属性代码如下:
@OneToOne(mappedBy = "userInfo", cascade = CascadeType.ALL) private AddressInfo addressInfo;
2. 插入数据时必须维护双向关联
你在构造实体进行插入时,不能只给UserInfo设置AddressInfo,还必须给AddressInfo设置对应的UserInfo实例,否则AddressInfo的userInfo属性为null,@MapsId无法拿到主键值就会抛出对应异常。
正确的插入代码示例:
// 构造并填充主实体属性 UserInfo user = new UserInfo(); user.setFirstName("测试"); user.setLastName("用户"); // 其他UserInfo属性赋值... // 构造并填充关联实体属性 AddressInfo address = new AddressInfo(); address.setHomeAddress("测试地址"); // 其他AddressInfo属性赋值... // 必须维护双向关联,这是之前缺失的关键步骤 user.setAddressInfo(address); address.setUserInfo(user); // 直接保存UserInfo即可,配置了Cascade.ALL会自动级联保存AddressInfo userInfoRepository.save(user);
验证说明
你之前单独保存UserInfo没有问题,是因为没有触发AddressInfo的级联保存逻辑,不需要读取关联属性的主键。完成上述修改后,再执行带关联的插入操作就可以正常执行,不会再抛出主键生成异常。
内容的提问来源于stack exchange,提问作者Thomson Mathew
相关产品推荐
相关产品推荐

