使用休眠@Index注释在 DB 上创建索引

我的项目上有注释驱动的休眠功能。

现在我想在列上创建一个索引。我当前的列定义是

@NotNull
@Column(name = "hash")
private String hash;

我在这里添加注释。@Index

@NotNull
@Column(name = "hash")
@Index(name="hashIndex")
private String hash;

然后删除表并重新启动 Tomcat 服务器。实例化服务器后,将创建表,但我在以下查询中看不到新索引。

SHOW INDEX FROM tableName

它有望使用新索引构造表。我正在将InnoDB与MySQL一起使用。


答案 1

有趣的是,在我的休眠配置中,我使用的是.hibernate.hbm2ddl.auto=update

这个修改现有数据库。我正在手动DROPping表并重新启动Tomcat,并且表已被构建,但索引尚未创建。tableName

但是,我在每次实例化Webapp时都重新创建了数据库,它删除了我的所有数据库并重建回来,并且 - 是的 - 我的新索引已经创建!hibernate.hbm2ddl.auto=create


答案 2

在 Hibernate 中故意禁用了架构更新时的索引创建,因为它似乎与架构导出中使用的命名不一致。

这是可以在类 中找到的注释代码。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


推荐