我正在使用LocalContainerEntityManagerFactoryBean并使用包扫描选项。
我想有一个我可以运行的简单实用程序,它将打印出它认为我应该运行的ddl更改。然后,我将从中查看并制作我的liquibase变更集。
答案 0 :(得分:0)
为什么不使用liquibase的diff功能来生成变更集?
comparing databases and genrating sql script using liquibase
答案 1 :(得分:0)
Liquibase支持将hibernate配置与现有数据库进行比较,但它目前不支持扫描包。有关休眠支持的一些信息,请参阅http://www.liquibase.org/manual/hibernate,有关源的https://github.com/liquibase/liquibase-hibernate。
根据您想要投入的工作量,使用现有的liquibase-hiberante源作为实用程序的基础并不会太困难。基本思想是获取一个休眠配置对象并为它创建一个liquibase.Database包装器。现有代码从hibernate config xml文件构建hibernate Configuration对象,但您可以直接从LocalContainerEntityManagerFactoryBean获取配置。
答案 2 :(得分: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));
}