Pregunta

Tengo capabilies de hibernación de anotación impulsada en mi proyecto.

Ahora quiero crear un índice en una columna. Mi definición de la columna actual es

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

y agrego anotación @Index aquí.

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

y luego DROP TABLE y reiniciar Tomcat servidor. Después se crea una instancia del servidor, se crea la tabla, pero no puedo ver el nuevo índice siguiente consulta.

SHOW INDEX FROM tableName

Se espera que la construcción de la tabla con el nuevo índice. Estoy utilizando InnoDB con MySQL.

¿Fue útil?

Solución

Es interesante que en mi configuración de Hibernate que estaba usando hibernate.hbm2ddl.auto=update.

Éste modifica una base de datos existente. Estaba dejando manualmente el tableName mesa y reiniciar Tomcat y la mesa se había construido, pero no estaba siendo creado el índice.

Sin embargo, me hizo hibernate.hbm2ddl.auto=create la que vuelve a crear la base de datos sobre cada instancia de aplicación web, se dejó caer toda mi base de datos y reconstruida atrás y -hell yeah- mi nuevo índice ha sido creada!

Otros consejos

creación de índices en la actualización del esquema fue deshabilitado intencionadamente en Hibernate porque parecía inconsistente con la nomenclatura utilizada en la exportación de esquema.

Este es el código comentado que se puede encontrar en org.hibernate.cfg.Configuration clase.

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

Por lo general, me quite ese comentario, recompilación Hibernate.jar y tienen índices creados en la actualización del esquema sin ningún problema, al menos con la base de datos Oracle.

En versiones recientes de Hibernate el comentario de la primera parte (índices de tabla) se ha eliminado en la versión oficial, así, mientras aún está comentó el segundo (índices que implementan claves únicas). Véase la discusión en http://opensource.atlassian.com/projects/hibernate/browse/HHH-1012

significa mejor diseño del esquema de base de datos es propiedad de un usuario diferente de los propios datos. Por lo tanto me puse hibernate.hbm2ddl.auto=none para que no haya fallos sobre Hibernate comienzan. Yo uso una vez SchemaPrinter. La salida de los cuales se puede ejecutar a través de mi herramienta favorita de SQL para recrear el esquema cuando sea necesario.

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

}

En Hibernate 3.5.6 usando <property name="hibernate.hbm2ddl.auto">update</property> se crean los índices. Por lo que una respuesta adecuada sería ahora para actualizar. Pero estoy dejando esta respuesta para aquellos como yo que han llegado a través de esta pregunta.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top