Spring Boot实体ID自动生成报错:No value passed for parameter 'id'
解决JPA实体自动生成ID时的构造参数错误
问题原因
你的Foo类主构造函数中id参数没有默认值,Kotlin要求调用构造函数时必须传入所有无默认值的参数,即使该ID会由数据库自动生成。
解决方案
1. 修改Foo实体类
给id参数添加默认值(设为null),保留@GeneratedValue注解的自动生成配置:
@Entity @Table(name = "foo") class Foo( @Id @GeneratedValue(strategy = GenerationType.IDENTITY) var id: Long? = null, // 添加默认值null @Column var count: Int = 1, @Column var added: Boolean = false, @Column var startDate: Date, @Column var endDate: Date, )
2. 修正Repository泛型类型
JpaRepository的第二个泛型参数需匹配ID的实际类型(Long),而非Number:
interface FooRepository : JpaRepository<Foo, Long> {}
3. Service层代码保持原有写法
现在可以继续在Service中创建Foo实例时不传入id参数,JPA会在持久化时自动从数据库获取生成的ID:
@Service class FooService@Autowired constructor( val fooRepository: FooRepository ) { fun addWhatever(data: ...): Boolean { val foo = Foo( count = data.count, added = data.added, startDate = data.startDate, endDate = data.endDate ) fooRepository.save(foo) // 持久化后foo.id会被自动赋值为数据库生成的ID return true // 根据业务逻辑调整返回值 } }
补充说明
使用IDENTITY策略时,数据库会在插入记录时自动生成主键值。将id设为可空类型并赋予默认值null,既满足Kotlin构造函数的参数要求,也符合JPA对未持久化实体的状态规则——持久化完成后,JPA会自动把生成的ID赋值给foo.id。
内容的提问来源于stack exchange,提问作者four-eyes
相关产品推荐
相关产品推荐

