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

Micronaut JDBC:能否使用Kotlin值类作为@Id属性?

Kotlin值类作为Micronaut Data JDBC的@Id属性是否可行?

Micronaut Data JDBC支持将Kotlin内联值类用作@Id属性,但你的代码存在类型不匹配等错误,导致编译失败。

代码中的问题分析

  1. 实体类id字段类型错误:你将User类的id字段声明为Int,但赋值却用了UserId(0),类型完全不匹配,这会让Micronaut Data无法识别主键的正确类型。
  2. 主键生成策略未明确适配:PostgreSQL推荐使用IDENTITY生成策略,未明确指定可能导致值类的主键映射逻辑异常。

修正后的代码

值类与实体类

import io.micronaut.data.annotation.*

@JvmInline
value class UserId(val value: Int)

@MappedEntity("users")
data class User(
    @field:Id
    @field:GeneratedValue(strategy = GenerationType.IDENTITY)
    val id: UserId = UserId(0),
    val name: String
)

仓库接口

import io.micronaut.data.jdbc.annotation.JdbcRepository
import io.micronaut.data.model.query.builder.sql.Dialect
import io.micronaut.data.repository.CrudRepository

@JdbcRepository(dialect = Dialect.POSTGRES)
interface UsersRepo : CrudRepository<User, UserId>

补充说明

  • 需确保Micronaut Data版本在3.8.0及以上,更早版本对Kotlin值类的支持存在局限。
  • 内联值类必须用@JvmInline修饰,Micronaut Data会自动识别其底层包装类型,完成数据库字段与值类的双向映射。
  • 针对PostgreSQL,指定GenerationType.IDENTITY会对应数据库的INT GENERATED AS IDENTITY自增主键类型,Micronaut Data会自动处理值类的封装与解封装逻辑。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.31 00:45:33