如何将数据库数组类型映射到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
相关产品推荐
相关产品推荐

