Указание метода индекса при использовании аннотации @Index
Я использую (пространственные) спящие аннотации для создания схемы для пространственного приложения, которое реализовано поверх 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;
[...]
}
Хотя экспортированная схема содержит индекс, к сожалению, он был создан с использованием нежелательного метода индекса; спящий режим, кажется, по умолчанию btree
Однако PostGIS рекомендует использовать GIST
индексы при работе с пространственными данными (см. http://postgis.net/docs/manual-2.0/using_postgis_dbmanagement.html).
CREATE INDEX idx_my_class_sidx
ON my_class
USING btree
(geom);
В то время как я мог бы просто вернуться к созданию индекса с простым SQL, мне интересно, есть ли способ использовать аннотации hibernate для переопределения типа метода по умолчанию для PostgreSQL? Решения или даже идеи, как это сделать, будут высоко оценены.
ТИА, Тилман
1 ответ
Я исследовал проблему, и кажется, что Денис прав. Смотря на класс 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
сам. Это, однако, специфичная для базы данных операция, которую должен поддерживать разработчик приложений (в случае изменения базы данных).