2

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

我想要一个可以运行的简单实用程序,它将打印出它认为我应该运行的 ddl 更改。然后我将审查并制作我的 liquibase 变更集。

4

3 回答 3

0

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

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

于 2012-03-06T19:55:12.920 回答
0

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

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

于 2012-03-04T12:17:30.650 回答
0

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


}
于 2015-02-11T07:17:05.857 回答