Frage

Ich habe Annotation-driven Hibernate capabilies auf mein Projekt.

Jetzt möchte ich einen Index über eine Spalte erstellen. Meine aktuelle Spaltendefinition ist

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

und ich @Index Anmerkung hier hinzufügen.

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

und dann DROP TABLE und Neustart Tomcat-Server. Nachdem der Server instanziiert wird, wird die Tabelle erstellt, aber ich kann keinen neuen Index auf folgende Abfrage sehen.

SHOW INDEX FROM tableName

Es wird erwartet, Tabelle mit neuem Index zu konstruieren. Ich bin mit InnoDB mit MySQL.

War es hilfreich?

Lösung

Interessanterweise ist in meiner Hibernate Konfiguration Ich war mit hibernate.hbm2ddl.auto=update.

Dieses eine ändert eine vorhandene Datenbank. Ich war die Tabelle tableName manuell löschen und neu zu starten Tomcat und die Tabelle aufgebaut worden ist, aber Index nicht erstellt wurde.

Allerdings habe ich hibernate.hbm2ddl.auto=create gemacht, die neu erstellte Datenbank bei jeder Instanziierung Webapp, ließ es fiel all meine Datenbank und wieder aufgebaut zurück und -hell yeah- mein neuer Index wird erstellt!

Andere Tipps

Index-Erstellung auf Schema Update wurde absichtlich in den Ruhezustand deaktiviert, weil sie mit der Namensgebung im Schema Export verwendet unvereinbar schien.

Dies ist der kommentierten Code, dass Sie in der Klasse org.hibernate.cfg.Configuration finden.

//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) );
    }
}

In der Regel entferne ich diesen Kommentar, recompile Hibernate.jar und habe Indizes für Schema-Update erstellt ohne Probleme, zumindest mit Oracle DB.

In der letzten Versionen von Hibernate des Kommentar auf dem ersten Teil (Tabellenindizes) als auch in der offiziellen Version entfernt, während es noch den zweiten (Indizes, die eindeutigen Schlüssel implementieren) kommentiert wird. Siehe die Diskussion unter http://opensource.atlassian.com/projects/hibernate/browse/HHH-1012

Bessere DB-Design bedeutet, dass das Schema von einem anderen Benutzer als die Daten selbst gehört. Daher stelle ich hibernate.hbm2ddl.auto=none so gibt es keine Ausfälle auf Hibernate sind starten. Ich stattdessen einen SchemaPrinter verwenden. Der Ausgang von dem über meinen Liebling SQL-Tool ausgeführt werden, um das Schema zu erstellen, wenn erforderlich.

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);
    }

}

In Hibernate 3.5.6 mit <property name="hibernate.hbm2ddl.auto">update</property> die Indizes erstellt. So eine richtige Antwort wäre jetzt zu aktualisieren. Aber ich verlasse diese Antwort für diejenigen wie mich, die sich über diese Frage kommen.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top