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
相关产品推荐
相关产品推荐

