PostgreSQL
 sql >> Baza danych >  >> RDS >> PostgreSQL

Błąd podczas mapowania tablic postgres w Spring JPA

Tak jak zauważył @jeff-wang, typy tablic Postgres nie są obsługiwane przez JPA. Konkretne implementacje mapowania można dodać ręcznie, ale @vlad-mihalcea dostarczył już przykładową implementację. Dostajesz to z maven central:

<dependency>
    <groupId>com.vladmihalcea</groupId>
    <artifactId>hibernate-types-52</artifactId>
    <version>${hibernate-types.version}</version>
</dependency>

Więcej szczegółów można znaleźć tutaj:https://vladmihalcea.com/how-to-map-java-and-sql-arrays-with-jpa-and-hibernate/

Po rozwiązaniu zależności należy dodać implementację określonego mapowania. Weźmy Postgresa bigint[] jako przykład. Może być zmapowany na przykład na Long[] . Najpierw musimy dodać deskryptor dla żądanego typu:

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";
    }
}

Następnie właściwa klasa mapowania:

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);
    }
}

Po wykonaniu tej czynności pozostaje tylko wziąć pod uwagę nasze mapowania w konfiguracji Spring. Przechowuję konfigurację mojego modelu danych oddzielnie w formie opartej na adnotacjach:

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 {
}

Teraz wszystko jest gotowe do użycia. Przykładowa kolumna z adnotacją z nowo dodanym mapowaniem w definicji DAO wygląda następująco:

@Type(
        type = "long-array"
)
@Column(
        columnDefinition = "bigint[]"
)
private Long[] author;


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. PRZESUNIĘCIE vs. ROW_NUMBER()

  2. Różnica między indeksem GiST i GIN

  3. Całkowicie odinstalować PostgreSQL 9.0.4 z Mac OSX Lion?

  4. Widoki list PostgreSQL

  5. Sprawdź połączenie z bazą danych za pomocą pg-promise podczas uruchamiania aplikacji