Micronaut JDBC:能否使用Kotlin值类作为@Id属性?
Kotlin值类作为Micronaut Data JDBC的@Id属性是否可行?
Micronaut Data JDBC支持将Kotlin内联值类用作@Id属性,但你的代码存在类型不匹配等错误,导致编译失败。
代码中的问题分析
- 实体类id字段类型错误:你将
User类的id字段声明为Int,但赋值却用了UserId(0),类型完全不匹配,这会让Micronaut Data无法识别主键的正确类型。 - 主键生成策略未明确适配: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
相关产品推荐
相关产品推荐

