Вопрос

У меня есть аннотационные гибернации на моем проекте.

Теперь я хочу создать индекс над столбцом. Мое текущее определение столбца

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

И я добавляю @Index Аннотация здесь.

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

А затем выбросить таблицу и перезапустите Tomcat Server. После создания сервера создается таблица, но я не вижу новый индекс по следующему запросу.

SHOW INDEX FROM tableName

Ожидается, что он построит таблицу с новым индексом. Я использую InnoDB с MySQL.

Это было полезно?

Решение

Интересно, в моей конфигурации гибернации я использовал hibernate.hbm2ddl.auto=update.

Этот изменяет существующую базу данных. Я был вручную упасть на стол tableName и перезапустить Tomcat и таблицу были построены, но индекс не создан.

Тем не менее, я сделал hibernate.hbm2ddl.auto=create который повторно создает базу данных при каждой области мнения WebApp, она упала всю мою базу данных и перестроила назад, и -hell, да - мой новый индекс был создан!

Другие советы

Создание индекса на обновлении схемы было намеренно отключено в гибернации, потому что казалось несовместимым с именами, используемыми в экспорте схемы.

Это прокомментированный код, который вы можете найти в классе 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/ibernate/browse/hhhh-1012.

Лучшая конструкция БД означает, что схема принадлежит другому пользователю, чем сам данные. Следовательно, я установил hibernate.hbm2ddl.auto=none Таким образом, нет никаких сбоев при стремлении к гибернации. Я использую вместо этого схема. Выход из которых можно запускать через мой любимый инструмент 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);
    }

}

В Hibernate 3.5.6 с использованием <property name="hibernate.hbm2ddl.auto">update</property> Индексы созданы. Так что правильный ответ теперь будет обновляться. Но я покидаю этот ответ для таких, как я, которые наступили на этот вопрос.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top