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

如何将数据库数组类型映射到Kotlin?解决UUID数组定义报错

解决JPA中UUID数组类型的映射问题

JPA默认不支持将UUID[]这类数组类型直接作为Basic属性映射,因此会抛出'Basic' attribute type should not be 'UUID[]'的错误。针对PostgreSQL的uuid[]类型,有两种常用的解决方式:

方法一:使用Hibernate内置类型(依赖Hibernate)

如果你的项目使用Hibernate作为JPA实现,可以直接用Hibernate提供的uuid-array类型来映射,无需自定义转换器:

@Entity
@Table(name = "foo")
class Foo(
    @Column(name = "bar_ids", columnDefinition = "uuid[]")
    @Type(type = "uuid-array") // Hibernate内置的UUID数组映射类型
    val barIds: Array<UUID>,

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    val id: Long = 0
)

该方式适用于Hibernate 5.2及以上版本,直接对应PostgreSQL的uuid[]类型,无需额外处理。

方法二:自定义JPA属性转换器(标准JPA兼容)

如果需要兼容不同的JPA实现,或者不想依赖Hibernate特定功能,可以自定义AttributeConverter来完成UUID数组与字符串数组的转换:

1. 实现转换器类

import jakarta.persistence.AttributeConverter
import jakarta.persistence.Converter
import java.util.UUID

@Converter(autoApply = true) // autoApply=true可自动应用到所有UUID[]属性
class UUIDArrayConverter : AttributeConverter<Array<UUID>, Array<String>> {
    override fun convertToDatabaseColumn(attribute: Array<UUID>?): Array<String>? {
        return attribute?.map(UUID::toString)?.toTypedArray()
    }

    override fun convertToEntityAttribute(dbData: Array<String>?): Array<UUID>? {
        return dbData?.map(UUID::fromString)?.toTypedArray()
    }
}

2. 在实体类中使用转换器

@Entity
@Table(name = "foo")
class Foo(
    @Column(name = "bar_ids", columnDefinition = "uuid[]")
    @Convert(converter = UUIDArrayConverter::class) // 指定转换器
    val barIds: Array<UUID>,

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    val id: Long = 0
)

转换器会在持久化时将UUID[]转为字符串数组,数据库存储为uuid[];读取时再将字符串数组转回UUID[],完全符合JPA标准规范。


内容的提问来源于stack exchange,提问作者four-eyes

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.21 23:33:20