我正在使用LocalContainerEntityManagerFactoryBean並使用軟件包進行掃描選項。使用LocalContainerEntityManagerFactoryBean生成模式更新到SQL文件
我想要一個簡單的實用程序,我可以運行它將打印出它認爲我應該運行的ddl更改。然後,我將審查和制定我的液體變更集。
我正在使用LocalContainerEntityManagerFactoryBean並使用軟件包進行掃描選項。使用LocalContainerEntityManagerFactoryBean生成模式更新到SQL文件
我想要一個簡單的實用程序,我可以運行它將打印出它認爲我應該運行的ddl更改。然後,我將審查和制定我的液體變更集。
爲什麼不使用liquibase的diff功能來生成變更集?
comparing databases and genrating sql script using liquibase
Liquibase有一個Hibernate的配置與現有的數據庫進行比較,一些支持,但當前不支持掃描包。有關休眠支持的一些信息,請參閱http://www.liquibase.org/manual/hibernate,有關源的信息請參見https://github.com/liquibase/liquibase-hibernate。
根據您想要投入的努力水平,使用現有的liquibase-hiberante源作爲您的實用程序的基礎並不是太困難。其基本思想是獲取一個hibernate Configuration對象併爲其創建一個liquibase.Database包裝器。現有代碼從hibernate config xml文件構建hibernate Configuration對象,但您可以直接從LocalContainerEntityManagerFactoryBean獲取配置。
https://github.com/RichardBradley/liquibase.github.com/commit/d1ac4950df280a140768a8c1421c221203d3c63d有關於提取和使用配置對象的一些信息 – 2012-03-06 20:23:51
我仍然不知道如何從LocalContainerEntityManager獲取配置。我發現的最接近的是:\t \t \t org.hibernate.ejb.Ejb3Configuration cfg = new org.hibernate.ejb.Ejb3Configuration(); \t \t \t org.hibernate.ejb.Ejb3Configuration配置= \t \t \t cfg.configure(fb.getPersistenceUnitInfo(),fb.getJpaPropertyMap()); org.hibernate.tool.hbm2ddl.SchemaExport的SchemaExport = \t \t \t新org.hibernate.tool.hbm2ddl.SchemaExport(configured.getHibernateConfiguration());但它有很多不贊成的調用。 – 2012-03-09 06:57:22
我得到了這個工作,但這不是我真正想要的。這只是吐出你想在空數據庫上運行的變更集。我想知道更新我的本地數據庫所需的變更集以滿足hibernate的期望。 – 2012-03-09 07:44:38
這裏是我使用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));
}
這不是我正在處理的場景。在我的情況下,所需的模式不存在於任何數據庫中。我希望能夠添加pojo,然後運行一個命令讓它告訴我它認爲模式應該是什麼,然後在構建時考慮這一點liquibase xml。這將幫助我仔細檢查我的工作。 – 2012-03-04 16:58:55