1

我正在使用(空间)休眠注释为在 PostGIS 之上实现的空间应用程序创建模式。从我的注释类创建数据库模式时,我需要创建空间索引以加速整个应用程序中使用的空间查询。

@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;
    [...]
}

虽然导出的模式包含索引,但不幸的是它是使用不受欢迎的索引方法创建的;hibernate 似乎默认为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 创建索引,但我想知道是否有一种方法可以使用休眠注释来覆盖 PostgreSQL 的默认方法类型?解决方案甚至想法如何做到这一点将不胜感激。

TIA,蒂尔曼

4

1 回答 1

0

我调查了这个问题,似乎丹尼斯是对的。Index从当前 hibernate 实现中查看类(参见1),很明显,尚不支持索引类型的规范。

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自己。然而,这是一个特定于数据库的操作,需要由应用程序开发人员维护(以防数据库更改)。

于 2013-05-29T10:11:48.887 回答