19

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

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

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

我在这里添加@Index注释。

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

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

SHOW INDEX FROM tableName

预计用新索引构建表。我正在将 InnoDB 与 MySQL 一起使用。

4

4 回答 4

18

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

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

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

于 2010-08-20T18:31:55.520 回答
9

在 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上的讨论

于 2011-03-01T17:57:02.683 回答
4

更好的数据库设计意味着架构由与数据本身不同的用户拥有。因此我设置hibernate.hbm2ddl.auto=none所以在休眠启动时没有失败。我改用 SchemaPrinter。其输出可以通过我最喜欢的 SQL 工具运行,以便在需要时重新创建模式。

import java.io.IOException;

import org.hibernate.cfg.AnnotationConfiguration;
import org.hibernate.cfg.Configuration;
import org.hibernate.cfg.Environment;
import org.hibernate.tool.hbm2ddl.SchemaExport;

public class SchemaPrinter {

    public static void main(String[] args) throws IOException {

        Configuration cfg = new AnnotationConfiguration()
            .addAnnotatedClass(MyClass1.class)
            .addAnnotatedClass(MyClass2.class)
            .setProperty(Environment.USER, "user")
            .setProperty(Environment.PASS, "password")
            .setProperty(Environment.URL, "jdbc:sybase:jndi:file://sql.ini?mydb")
            .setProperty(Environment.DIALECT, "org.hibernate.dialect.SybaseASE15Dialect")
            .setProperty(Environment.DRIVER, "com.sybase.jdbc4.jdbc.SybDriver")
            .setProperty(Environment.HBM2DDL_AUTO, "none")
        SchemaExport exp = new SchemaExport(cfg);
        exp.setOutputFile("schema.ddl");
        exp.create(true, false);
    }

}
于 2013-12-12T10:58:15.493 回答
2

在 Hibernate 3.5.6 中使用<property name="hibernate.hbm2ddl.auto">update</property> 创建索引。所以现在一个正确的答案是升级。但是我把这个答案留给像我这样遇到这个问题的人。

于 2013-11-06T15:48:36.430 回答