Kotlin使用Micronaut Data实现父子实体关联时Identity缺失报错如何解决
问题根源
两个配置错误共同导致报错:
- Kotlin 构造参数上的注解默认作用于参数本身,Micronaut Data 无法扫描到没有加
field:前缀的@Id、@GeneratedValue注解,无法识别实体的主键字段 - 双向关联中
ONE_TO_MANY侧的集合属性放在主构造函数中,被 Micronaut Data 错误识别为需要持久化的普通字段,遍历属性时触发主键校验失败
修复方案
- 给主键相关注解增加
field:前缀,确保注解作用于类字段 - 将
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
相关产品推荐
相关产品推荐

