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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.15 08:12:11