在 Hibernate 中有意禁用模式更新时的索引创建,因为它似乎与模式导出中使用的命名不一致。
这是您可以在 class 中找到的注释代码org.hibernate.cfg.Configuration
。
//broken, 'cos we don't generate these with names in SchemaExport
subIter = table.getIndexIterator();
while ( subIter.hasNext() ) {
Index index = (Index) subIter.next();
if ( !index.isForeignKey() || !dialect.hasImplicitIndexForForeignKey() ) {
if ( tableInfo==null || tableInfo.getIndexMetadata( index.getFilterName() ) == null ) {
script.add( index.sqlCreateString(dialect, mapping) );
}
}
}
//broken, 'cos we don't generate these with names in SchemaExport
subIter = table.getUniqueKeyIterator();
while ( subIter.hasNext() ) {
UniqueKey uk = (UniqueKey) subIter.next();
if ( tableInfo==null || tableInfo.getIndexMetadata( uk.getFilterName() ) == null ) {
script.add( uk.sqlCreateString(dialect, mapping) );
}
}
通常我删除该注释,重新编译 Hibernate.jar 并在模式更新时创建索引而没有任何问题,至少对于 Oracle DB。
在最近的 Hibernate 版本中,对第一部分(表索引)的注释在正式版本中也被删除了,而它仍然对第二部分(实现唯一键的索引)进行了注释。请参阅http://opensource.atlassian.com/projects/hibernate/browse/HHH-1012上的讨论