Создание сценариев обновления базы данных с помощью Hibernate/Spring

У меня есть проект, в котором мы используем спящий режим для обновления базы данных с изменениями (hibernate.hbm2ddl.auto=update)... даже на prod... Вместо этого я переношу его на использование liquibase.

Единственное, что меня беспокоит, это то, что не все в моей команде являются гуру sql, поэтому я ищу простой способ сгенерировать сценарий sql, который сделал бы hibernate, если бы он обновлял базу данных.

Мы все используем Intellij IDEA, но не смогли найти эту функцию.

Знаете ли вы какой-нибудь инструмент, способный это сделать?

Спасибо


person tibo    schedule 12.11.2013    source источник


Ответы (4)


Чтобы на самом деле отобразить сценарии, сгенерированные Hibernate из ваших сопоставлений, вы можете:

  • как предложил Андрей I, добавьте эти две строки в свой application.properties:

    spring.jpa.hibernate.ddl-auto=validate
    logging.level.org.hibernate.tool.hbm2ddl=DEBUG
    

Источник для Hibernate 4.3: SchemaUpdate.java

  • или вручную сгенерируйте эти скрипты со следующим кодом:

    LocalSessionFactoryBuilder sessionFactory = new LocalSessionFactoryBuilder(dataSource);
    sessionFactory.scanPackages("your.package.containing.entities");
    Dialect dialect = new MySQL5Dialect(); // select your dialect
    DatabaseMetadata metadata = new DatabaseMetadata(dataSource.getConnection(), dialect, sessionFactory);
    List<SchemaUpdateScript> scripts = sessionFactory.generateSchemaUpdateScriptList(dialect, metadata);
    
    Formatter formatter = FormatStyle.DDL.getFormatter();
    for (SchemaUpdateScript script : scripts) {
       System.err.println(formatter.format(script.getScript()) + ";");
    }
    

Вы даже можете добавить этот код в @Test, как описано здесь.

Удачи!

person darrachequesne    schedule 20.03.2016
comment
у вас есть рабочее решение для Hibernate 5.2? Спасибо - person drenda; 16.03.2018

Полный дамп схемы с mvn hibernate4:export и pom.xml:

<!-- To export full DDL schema as it seeing by Hibernate run: mvn hibernate4:export -->
<plugin>
    <!-- http://mydevnotes.nicus.it/2013/03/generate-ddl-with-maven-jpa-hibernate-4.html -->
    <groupId>de.juplo</groupId>
    <artifactId>hibernate4-maven-plugin</artifactId>
    <version>1.1.0</version>
    <configuration>
        <hibernateDialect>org.hibernate.dialect.MySQLDialect</hibernateDialect>
        <delimiter>;</delimiter>
        <target>SCRIPT</target>
        <outputFile>${project.build.directory}/schema-hibernate4-maven-plugin.sql</outputFile>
    </configuration>
</plugin>

Вы можете скопировать необходимые части.

С LiquiBase у вас есть больше возможностей, генерируя различия между БД и файлом отображения / аннотациями Hibernate с помощью mvn liquibase:diff и соответствующей части в pom.xml:

<plugin>
    <groupId>org.liquibase</groupId>
    <artifactId>liquibase-maven-plugin</artifactId>
    <version>${liquibase.version}</version>
    <configuration>
        <changeLogFile>${basedir}/src/main/resources/sql/master.xml</changeLogFile>
        <propertyFile>${liquibase.profile}</propertyFile>
        <promptOnNonLocalDatabase>false</promptOnNonLocalDatabase>
        <logging>debug</logging>
        <outputFileEncoding>utf-8</outputFileEncoding>
        <driver>com.mysql.jdbc.Driver</driver>
        <!-- <url>jdbc:mysql://localhost:3306/app?autoReconnect=true&amp;characterEncoding=utf-8</url> -->
        <!-- <username>AAAAAA</username> -->
        <!-- <password>BBBBBB</password> -->
        <defaultSchemaName>testx</defaultSchemaName>
        <changelogSchemaName>testx</changelogSchemaName>

        <!-- For mvn liquibase:updateSQL -->
        <migrationSqlOutputFile>migration.sql</migrationSqlOutputFile>

        <referenceUrl>hibernate:spring:com.app.domain?dialect=org.hibernate.dialect.MySQLDialect</referenceUrl>
        <diffChangeLogFile>changelogDiff.xml</diffChangeLogFile>
        <diffTypes>tables,views,columns,indexes,foreignkeys,primarykeys,uniqueconstraints</diffTypes>
    </configuration>
    <dependencies>
        <dependency>
            <groupId>org.springframework.data</groupId>
            <artifactId>spring-data-jpa</artifactId>
            <version>${spring-data.version}</version>
        </dependency>
        <!-- https://github.com/liquibase/liquibase-hibernate/wiki -->
        <dependency>
            <groupId>org.liquibase.ext</groupId>
            <artifactId>liquibase-hibernate4.2</artifactId>
            <version>3.5</version>
        </dependency>
    </dependencies>
</plugin>

Вы можете прочитать мои заметки о http://tips.defun.work/liquibase.html.

person gavenkoa    schedule 24.12.2015

Что ж, я не знаю очень простого решения, но, возможно, вам поможет следующее:

на ваших локальных машинах включите вашу библиотеку журналов для отображения запросов DDL. Например, посмотрите здесь для примера и здесь для журнала гибернации категории.

После сохранения всех изменений в вашей локальной БД (с hibernate.hbm2ddl.auto=update) вы получите желаемый результат. В производстве используйте hibernate.hbm2ddl.auto=validate.

В конечном итоге вы можете подумать о том, чтобы сделать это на специальном экземпляре сервера, при этом все данные журнала DDL сохраняются в специальном файле.

Также вы можете проверить, ставит ли hibernate запросы на обновление, когда hibernate.hbm2ddl.auto=validate.

person Andrei I    schedule 13.11.2013

Пожалуйста, ознакомьтесь со следующей статьей:

Скрипт генерации схемы из Hibernate

Это немного устарело, но немного скорректировано:

  • Замените «создать» на «обновить» в объекте конфигурации
  • Настройте базовое имя пакета вашего домена
  • Только сгенерируйте его с диалектом, который вам нужен. В примере используются три диалекта для Oracle, MySQL и HSQL.

Удачи

person frandevel    schedule 20.02.2015