1

PostGIS 위에 구현 된 공간 애플리케이션을위한 스키마를 생성하기 위해 (공간적) hibernate 어노테이션을 사용하고 있습니다. 주석이 달린 클래스에서 데이터베이스 스키마를 만들 때 응용 프로그램 전체에서 사용되는 공간 쿼리 속도를 높이기 위해 공간 인덱스를 만들어야합니다.@Index annotation을 사용할 때 인덱스 메소드 지정하기

@Entity 
@Table(name = "MY_CLASS") 
@org.hibernate.annotations.Table(
    appliesTo = "MY_CLASS", indexes = { 
     @Index(name = "idx_my_class_sidx", 
      columnNames = { "GEOM" }) }) 
public class MyClass { 
    [...] 
    @Column(name = "GEOM") 
    @Type(type = "org.hibernate.spatial.GeometryType") 
    private LineString geom; 
    [...] 
} 

내 보낸 스키마에 색인이 포함되어 있지만 불행히도 원하지 않는 색인 방법으로 생성되었습니다. 최대 절전 모드는 btree으로 기본 설정되어 있지만 PostGIS는 공간 데이터를 처리 할 때 GIST 인덱스를 사용할 것을 권장합니다 (http://postgis.net/docs/manual-2.0/using_postgis_dbmanagement.html#id441511 참조). 난 그냥 일반 SQL과 인덱스를 생성 다시 떨어질 가능성이있는 반면

CREATE INDEX idx_my_class_sidx 
    ON my_class 
    USING btree 
    (geom); 

, PostgreSQL을위한 기본 방법의 유형을 재정의 최대 절전 모드 주석을 사용하는 방법이 있는지 궁금 해요? 솔루션이나 아이디어를 어떻게 할 것인지 매우 높이 평가 될 것입니다.

TIA, 틸만

+0

[최대 절전 모드에서 PostgreSQL GIN 색인에 주석을 달 수있는 방법] 가능한 복제본 (http://stackoverflow.com/questions/13243263/how-to-annotate-a-postgresql-gin-index-in-hibernate) –

답변

0

나는이 문제를 조사하고 데니스 잘처럼 보인다. 현재 최대 절전 모드 구현 (참조 : 1)의 클래스 Index을 살펴보면 인덱스 유형의 지정이 아직 지원되지 않음을 알 수 있습니다.

public static String buildSqlCreateIndexString(
     Dialect dialect, 
     String name, 
     Table table, 
     Iterator<Column> columns, 
     java.util.Map<Column, String> columnOrderMap, 
     boolean unique, 
     String defaultCatalog, 
     String defaultSchema 
) { 
    StringBuilder buf = new StringBuilder("create") 
      .append(unique ? 
        " unique" : 
        "") 
      .append(" index ") 
      .append(dialect.qualifyIndexName() ? 
        name : 
        StringHelper.unqualify(name)) 
      .append(" on ") 
      .append(table.getQualifiedName(dialect, defaultCatalog, defaultSchema)) 
      .append(" ("); 
    while (columns.hasNext()) { 
     Column column = columns.next(); 
     buf.append(column.getQuotedName(dialect)); 
     if (columnOrderMap.containsKey(column)) { 
      buf.append(" ").append(columnOrderMap.get(column)); 
     } 
     if (columns.hasNext()) buf.append(", "); 
    } 
    buf.append(")"); 
    return buf.toString(); 
} 

가장 간단한 해결 방법은 session.createSQLQuery()를 호출하고 CREATE INDEX 직접 발행하는 것입니다. 그러나 이는 데이터베이스 개발자가 유지해야하는 데이터베이스 관련 작업입니다 (데이터베이스가 변경된 경우).