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

Kotlin使用Micronaut Data实现父子实体关联时Identity缺失报错如何解决

问题根源

两个配置错误共同导致报错:

  • Kotlin 构造参数上的注解默认作用于参数本身,Micronaut Data 无法扫描到没有加field:前缀的@Id、@GeneratedValue注解,无法识别实体的主键字段
  • 双向关联中ONE_TO_MANY侧的集合属性放在主构造函数中,被 Micronaut Data 错误识别为需要持久化的普通字段,遍历属性时触发主键校验失败

修复方案

  1. 给主键相关注解增加field:前缀,确保注解作用于类字段
  2. 将Parent中的children关联属性移到类体中,不要放入主构造参数,默认初始化空集合即可

修复后代码示例

Parent 实体

import io.micronaut.data.annotation.GeneratedValue
import io.micronaut.data.annotation.Id
import io.micronaut.data.annotation.MappedEntity
import io.micronaut.data.annotation.Relation

@MappedEntity
class Parent(
  @field:Id
  @field:GeneratedValue
  var id: Long?,
  var name: String?
){
  @Relation(value = Relation.Kind.ONE_TO_MANY, mappedBy = "parent")
  val children: Set<Child> = emptySet()
}

Child 实体

import io.micronaut.data.annotation.GeneratedValue
import io.micronaut.data.annotation.Id
import io.micronaut.data.annotation.MappedEntity
import io.micronaut.data.annotation.Relation

@MappedEntity
class Child(
  @field:Id
  @field:GeneratedValue
  var id: Long?,
  var name: String?,
  @Relation(value = Relation.Kind.MANY_TO_ONE)
  var parent: Parent?
)

调整后重启项目,Schema生成阶段可正确识别Parent的主键字段,同时不会将children属性当做普通表列处理,报错即可消失。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.27 20:54:02