You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Spring Data JPA+Postgres 一对一关联映射插入数据报IdentifierGenerationException错误

问题根因与解决方案

错误根因

你遇到的org.hibernate.id.IdentifierGenerationException: attempted to assign id from null one-to-one property异常由两个问题共同导致:

  1. UserInfo实体类的OneToOne关联注解配置错误
  2. 插入数据时未正确维护双向关联的引用关系,导致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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.06 06:27:04