使用LocalContainerEntityManagerFactoryBean时生成SQL文件的架构更新



我使用LocalContainerEntityManagerFactoryBean并使用包扫描选项。

我想有一个可以运行的简单实用程序,它会打印出它认为我应该运行的ddl更改。然后我将回顾并制作我的利库巴糖变更集。

为什么不使用liquibase的diff功能来生成变更集?

使用liquibase比较数据库和生成sql脚本

Liquibase支持将hibernate配置与现有数据库进行比较,但目前不支持扫描包。看见http://www.liquibase.org/manual/hibernate有关hibernate支持的一些信息,以及https://github.com/liquibase/liquibase-hibernate源。

根据你想要投入的努力程度,使用现有的liquibase冬眠源作为你的实用程序的基础不会太困难。基本思想是获得一个hibernate配置对象并制作一个liquibase。现有代码从hibernate配置xml文件构建hibernate配置对象,但您可以直接从LocalContainerEntityManagerFactoryBean获取配置。

这是我使用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));

}

相关内容

  • 没有找到相关文章

最新更新