index example java hibernate annotations hibernate-annotations database-indexes

java - example - Creación de índices en DB con Hibernate @Index Annotation



jpa index (4)

Curiosamente, en mi configuración de Hibernate estaba usando hibernate.hbm2ddl.auto=update .

Éste modifica una base de datos existente. Estaba SALTANDO manualmente la tabla tableName y reiniciando Tomcat y la tabla se había construido pero el índice no se estaba creando.

Sin embargo, hice hibernate.hbm2ddl.auto=create que vuelve a crear la base de datos en cada instancia de la aplicación web, eliminó toda mi base de datos y la reconstruyó y, ¡sí, mi nuevo índice ha sido creado!

Tengo capacidades de hibernación basadas en anotaciones en mi proyecto.

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

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

y @Index anotación @Index aquí.

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

y luego DROP TABLE y reinicie el servidor Tomcat. Una vez que se crea una instancia del servidor, se crea la tabla pero no puedo ver un nuevo índice en la siguiente consulta.

SHOW INDEX FROM tableName

Se espera construir la tabla con nuevo índice. Estoy usando InnoDB con MySQL.


En Hibernate 3.5.6 utilizando <property name="hibernate.hbm2ddl.auto">update</property > se crean los índices. Así que una respuesta adecuada ahora sería actualizar. Pero voy a dejar esta respuesta para aquellos como yo que han encontrado esta pregunta.


La creación de índices en la actualización del esquema se deshabilitó intencionalmente en Hibernate porque parecía incoherente con el nombre utilizado en la exportación del esquema.

Este es el código comentado que puede encontrar en la clase 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) ); } }

Por lo general, elimino ese comentario, recompilo Hibernate.jar y se crean índices en la actualización del esquema sin ningún problema, al menos con Oracle DB.

En las versiones recientes de Hibernate, el comentario sobre la primera parte (índices de tablas) también se eliminó en la versión oficial, mientras que aún se comenta la segunda (índices que implementan claves únicas). Vea la discusión en http://opensource.atlassian.com/projects/hibernate/browse/HHH-1012


Un mejor diseño de base de datos significa que el esquema es propiedad de un usuario diferente a los datos en sí. Por lo tanto, configuro hibernate.hbm2ddl.auto=none para que no haya fallas en el inicio de Hibernate. Yo uso un SchemaPrinter en su lugar. El resultado del cual se puede ejecutar a través de mi herramienta SQL favorita 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); } }