1

我使用(空間)hibernate註釋爲在PostGIS上實現的空間應用程序創建模式。當從我的註釋類創建數據庫模式時,我需要創建空間索引來加速整個應用程序中使用的空間查詢。使用@Index註釋時指定索引方法

@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)。

CREATE INDEX idx_my_class_sidx 
    ON my_class 
    USING btree 
    (geom); 

雖然我可能只是回落創建與普通的SQL索引,我不知道是否有使用Hibernate的註解來覆蓋PostgreSQL的默認方法類型的方法嗎?解決方案甚至想法如何做到這一點將不勝感激。

TIA, 蒂爾曼

+0

可能重複[如何在Hibernate中註釋PostgreSQL GIN索引](http://stackoverflow.com/questions/13243263/how-to-annotate-a-postgresql-gin-index-in-hibernate) –

回答

0

我調查的問題,它似乎像丹尼斯是正確的。從目前的hibernate實現(參見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。但是,這是數據庫特定的操作,需要由應用程序開發人員進行維護(以防數據庫發生更改)。