Hibernate自定义类型允许映射各种数据库特定的列类型,比如IP地址、JSON列、位集或SQL数组。定义定制Hibernate类型有两种方法: UserType接口和 Java and SQL descriptors。 Java and SQL descriptors是首选的,因为它允许更好地分离 Java-to-JDBC 和 JDBC-to-SQL 类型处理。在本文中,我们将了解如何将PostgreSQL数据库中的数组映射到它们的Java对应对象中。
SQL映射到JPA
首先我们在postgreSQL数据库中创建如下含有Array列的test表:
create table array_test (
id int8 not null,
version int4,
sensor_names text[],
sensor_values integer[],
primary key (id)
)
我们希望使用JPA和Hibernate映射这个表。但是,JPA和Hibernate默认都不支持SQL数组,我们希望将这些数组分别映射到字符串和int Java数组。
这个数据库表的JPA实体映射如下(string-array和int-array是自定义类型,实现SQL数组与java数组转换):
@Entity(name = "ArrayTestEntity")
@Table(name = "array_test")
@TypeDefs({
@TypeDef(name = "string-array", typeClass = StringArrayType.class),
@TypeDef(name = "int-array", typeClass = IntArrayType.class)
})
public class ArrayTestEntity {
@Id
private Long id;
@Version
private int version;
@Type( type = "string-array" )
@Column(name = "sensor_names",columnDefinition = "text[]")
private String[] sensorNames;
@Type( type = "int-array" )
@Column(name = "sensor_values", columnDefinition = "int[]")
private int[] sensorValues;
//Getters and setters omitted for brevity
}
接下来完成自定义StringArrayType类与IntArrayType类,需要继承AbstractSingleColumnStandardBasicType类并完成定义 Java and SQL descriptors:
public class StringArrayType
extends