2012-03-04 47 views

回答

0

爲什麼不使用liquibase的diff功能來生成變更集?

comparing databases and genrating sql script using liquibase

+0

這不是我正在處理的場景。在我的情況下,所需的模式不存在於任何數據庫中。我希望能夠添加pojo,然後運行一個命令讓它告訴我它認爲模式應該是什麼,然後在構建時考慮這一點liquibase xml。這將幫助我仔細檢查我的工作。 – 2012-03-04 16:58:55

0

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獲取配置。

+0

https://github.com/RichardBradley/liquibase.github.com/commit/d1ac4950df280a140768a8c1421c221203d3c63d有關於提取和使用配置對象的一些信息 – 2012-03-06 20:23:51

+0

我仍然不知道如何從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

+0

我得到了這個工作,但這不是我真正想要的。這只是吐出你想在空數據庫上運行的變更集。我想知道更新我的本地數據庫所需的變更集以滿足hibernate的期望。 – 2012-03-09 07:44:38

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)); 


}