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

Spring Boot中JPA持久化后无法获取@GeneratedValue自增ID

Spring Boot JPA自增字段save后内存中值为null的问题排查

核心问题及解决方法

1. 未使用save方法返回的实体对象

CrudRepository的save方法会返回数据库持久化后的实体实例,该实例已包含数据库生成的自增ID。你当前直接使用原对象sonClassEntity,而原对象不会被JPA自动更新,因此内存中numero仍为null。

修正代码:

// 接收save返回的已持久化实体
SonClassEntity savedEntity = sonClassRepository.save(sonClassEntity);
// 使用保存后的实体进行DTO转换
return Optional.of(savedEntity).map(cuponDTOMapper).orElseThrow();

2. 实体类字段注解缺失

@GeneratedValue(strategy = GenerationType.IDENTITY)是主键生成策略注解,必须配合@Id注解使用,用于标识该字段为实体主键。你的SonClassEntity中numero字段仅添加了@GeneratedValue,缺少@Id注解,导致JPA无法识别这是需要自动回填的主键字段。

修正实体类:

@Data
@NoArgsConstructor
@AllArgsConstructor
@Entity
@Table(name = "father_table")
@PrimaryKeyJoinColumn(name = "pk_father_column")
public class SonClassEntity extends FatherClassEntity {
    @Id // 添加@Id注解标识主键
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name = "numero", nullable = false)
    private Integer numero;
}

3. 仓库接口泛型参数错误

你的仓库接口SonClass继承FatherClass<SonClass>时,泛型参数传入的是仓库接口本身,而非实体类SonClassEntity。这会导致JPA无法正确关联实体,影响ID回填逻辑。

修正仓库接口:

@Repository
public interface SonClassRepository extends FatherClass<SonClassEntity> {
    // 自定义方法
}

同时调整父仓库接口的泛型约束,确保T指向实体类型:

@NoRepositoryBean
public interface FatherClass<T extends FatherClassEntity> extends CrudRepository<T, Integer>{

}

内容的提问来源于stack exchange,提问作者Leo

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.10 17:42:35