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

新しいインデックスでテーブルを構築することが期待されています。MySQL で InnoDB を使用しています。

4

4 に答える 4

18

興味深いことに、Hibernate構成ではを使用してhibernate.hbm2ddl.auto=updateいました。

これは既存のデータベースを変更します。テーブルを手動で削除してtableNameTomcatを再起動しましたが、テーブルは作成されましたが、インデックスは作成されていませんでした。

ただし、hibernate.hbm2ddl.auto=createwebappをインスタンス化するたびにデータベースを再作成するものを作成しました。これにより、すべてのデータベースが削除されて再構築され、新しいインデックスが作成されました。

于 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 の最近のバージョンでは、最初の部分 (テーブル インデックス) のコメントは公式バージョンでも削除されましたが、2 番目の部分 (一意のキーを実装するインデックス) はまだコメントされています。http://opensource.atlassian.com/projects/hibernate/browse/HHH-1012のディスカッションを参照してください。

于 2011-03-01T17:57:02.683 に答える
4

優れた DB 設計とは、スキーマがデータ自体とは異なるユーザーによって所有されることを意味します。したがってhibernate.hbm2ddl.auto=none、Hibernate の起動時にエラーが発生しないように設定しました。代わりに 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 に答える