Точно както @jeff-wang посочи, типовете масиви на Postgres не се поддържат от JPA. Специфични реализации на картографиране могат да се добавят ръчно, но @vlad-mihalcea вече е предоставил примерна реализация. Получавате го от maven central:
<dependency>
<groupId>com.vladmihalcea</groupId>
<artifactId>hibernate-types-52</artifactId>
<version>${hibernate-types.version}</version>
</dependency>
Повече подробности можете да намерите тук:https://vladmihalcea.com/how-to-map-java-and-sql-arrays-with-jpa-and-hibernate/
След разрешаване на зависимостта трябва да се добави реализация за специфично картографиране. Нека вземем Postgres bigint[]
като пример. Може да се съпостави например с Long[]
. Първо, трябва да добавим дескриптор за желания тип:
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";
}
}
След това действителният клас на картографиране:
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);
}
}
След като това е направено, всичко, което остава да направим, е да вземем предвид нашите съпоставяния в конфигурацията на Spring. Поддържам конфигурацията на моя модел на данни отделно във форма, базирана на пояснения:
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 {
}
Сега всичко е готово за използване. Примерна колона, анотирана с новодобавено съпоставяне в дефиницията на DAO, изглежда по следния начин:
@Type(
type = "long-array"
)
@Column(
columnDefinition = "bigint[]"
)
private Long[] author;