Создание обновлений схемы в файл SQL при использовании LocalContainerEntityManagerFactoryBean - PullRequest
2 голосов
/ 04 марта 2012

Я использую LocalContainerEntityManagerFactoryBean и использую опцию сканирования пакетов.

Я хотел бы иметь простую утилиту, которую я могу запустить, которая будет распечатывать изменения ddl, которые, по его мнению, я должен запустить.Затем я рассмотрю и создам наборы изменений в моей жидкостной базе.

Ответы [ 3 ]

0 голосов
/ 06 марта 2012

Liquibase имеет некоторую поддержку для сравнения конфигурации гибернации с существующей базой данных, но в настоящее время она не поддерживает отсканированные пакеты. См. http://www.liquibase.org/manual/hibernate для получения дополнительной информации о поддержке гибернации и https://github.com/liquibase/liquibase-hibernate для источника.

В зависимости от уровня усилий, которые вы хотите приложить, не составит особого труда использовать существующий источник жидкости-гибибаранты в качестве основы для вашей работы. Основная идея заключается в том, чтобы получить объект конфигурации hibernate и создать для него оболочку liquibase.Database. Существующий код создает объект конфигурации hibernate из XML-файла конфигурации hibernate, но вы можете получить свою конфигурацию непосредственно из LocalContainerEntityManagerFactoryBean.

0 голосов
/ 11 февраля 2015

Вот мое решение, использующее Spring 4 и Hibernate 4. Оно не учитывает некоторые аннотации при обновлении, такие как @ ForeignKey , но оно относится к экспорту. Есть множество флагов и больше классов, так что, возможно, есть еще лучший способ. Я хотел бы сделать больше рабочего процесса с этого момента. Возможно, какой-то рабочий процесс с git, чтобы вы могли отслеживать изменения и сравнивать их с файлом liquibase?

public static void main(String[] args) throws IOException {

    ApplicationContext context = new AnnotationConfigApplicationContext(DataConfig.class, PropertySourceConfig.class);
    EntityManager entityManager = context.getBean(EntityManager.class);

    DataConfig dataConfig = context.getBean(DataConfig.class);

    String dialect = "org.hibernate.dialect.PostgreSQL9Dialect";

    Configuration cfg = new Configuration();
    cfg.setProperty("hibernate.hbm2ddl.auto", "update");
    cfg.setProperty("hibernate.dialect", dialect);
    cfg.setProperty("hibernate.connection.url", dataConfig.getUserNamePasswordConnectionUrl());

    for (EntityType<?> entity : entityManager.getMetamodel().getEntities()) {
        cfg.addAnnotatedClass(entity.getJavaType());
    }



    SchemaExport export = new SchemaExport(cfg);
    export.setDelimiter(";");
    File tempExportFile = File.createTempFile("Export", null);

    export.setOutputFile(tempExportFile.getAbsolutePath());
    export.setFormat(true);
    export.execute(true, false, false, false);

    System.out.println("EXPORT SCRIPT = " + FileUtils.readFileToString(tempExportFile));

    File tempUpdateFile = File.createTempFile("Update", null);

    SchemaUpdate update = new SchemaUpdate(cfg);
    update.setDelimiter(";");
    update.setOutputFile(tempUpdateFile.getAbsolutePath());
    update.setFormat(true);
    update.execute(true,false);

    System.out.println("UPDATE SCRIPT = " + FileUtils.readFileToString(tempUpdateFile));


}
0 голосов
/ 04 марта 2012

Почему бы не использовать diff-функцию liquibase для генерации наборов изменений?

сравнение баз данных и создание сценария sql с использованием liquibase

...