Giống như @ jeff-wang đã chỉ ra, các kiểu mảng Postgres không được JPA hỗ trợ. Các triển khai ánh xạ cụ thể có thể được thêm theo cách thủ công, nhưng @ vlad-mihalcea đã cung cấp triển khai mẫu. Bạn nhận được nó từ trung tâm maven:
<dependency>
<groupId>com.vladmihalcea</groupId>
<artifactId>hibernate-types-52</artifactId>
<version>${hibernate-types.version}</version>
</dependency>
Bạn có thể tham khảo thêm chi tiết tại đây:https://vladmihalcea.com/how-to-map-java-and-sql-arrays-with-jpa-and-hibernate/
Sau khi giải quyết sự phụ thuộc, cần phải thêm một triển khai cho ánh xạ cụ thể. Hãy để chúng tôi lấy Postgres bigint[]
như một ví dụ. Nó có thể được ánh xạ tới ví dụ Long[]
. Đầu tiên, chúng ta cần thêm bộ mô tả cho loại mong muốn:
import com.vladmihalcea.hibernate.type.array.internal.AbstractArrayTypeDescriptor;
public class LongArrayTypeDescriptor extends AbstractArrayTypeDescriptor<Long[]> {
public static final LongArrayTypeDescriptor INSTANCE = new LongArrayTypeDescriptor();
public LongArrayTypeDescriptor() {
super(Long[].class);
}
protected String getSqlArrayType() {
return "bigint";
}
}
Sau đó, lớp ánh xạ thực tế:
import com.vladmihalcea.hibernate.type.array.internal.ArraySqlTypeDescriptor;
import org.hibernate.type.AbstractSingleColumnStandardBasicType;
import org.hibernate.usertype.DynamicParameterizedType;
import java.util.Properties;
public class LongArrayType extends AbstractSingleColumnStandardBasicType<Long[]> implements DynamicParameterizedType {
public static final LongArrayType INSTANCE = new LongArrayType();
public LongArrayType() {
super(ArraySqlTypeDescriptor.INSTANCE, LongArrayTypeDescriptor.INSTANCE);
}
public String getName() {
return "long-array";
}
@Override
protected boolean registerUnderJavaType() {
return true;
}
@Override
public void setParameterValues(Properties parameters) {
((LongArrayTypeDescriptor) getJavaTypeDescriptor()).setParameterValues(parameters);
}
}
Điều đó đang được thực hiện, tất cả những gì còn lại phải làm là xem xét các ánh xạ của chúng ta trong cấu hình Spring. Tôi đang giữ riêng cấu hình mô hình dữ liệu của mình ở dạng dựa trên chú thích:
import ibdb.model.mappers.LongArrayType;
import ibdb.model.mappers.ShortArrayType;
import org.hibernate.annotations.TypeDef;
import org.hibernate.annotations.TypeDefs;
import javax.persistence.MappedSuperclass;
@TypeDefs({
@TypeDef(
name = "long-array",
typeClass = LongArrayType.class
),
@TypeDef(
name = "short-array",
typeClass = ShortArrayType.class
)
})
@MappedSuperclass
public class DaoConfig {
}
Bây giờ mọi thứ đã sẵn sàng để sử dụng. Cột ví dụ được chú thích với ánh xạ mới được thêm vào trong định nghĩa DAO trông giống như sau:
@Type(
type = "long-array"
)
@Column(
columnDefinition = "bigint[]"
)
private Long[] author;