2013-10-28 125 views
3

我想寫一個基於由Hibernate提供的SchemaUpdate類的Liquibase變更集生成器。 目標是獲得Hibernate更新腳本的好處以及開發人員根據需要調整它們的可能性。 完成後,SQL將被集成到Liquibase SQL文件中。休眠4.3 SchemaUpdate與JPA

通過實例化SchemaUpdate類並啓動execute方法,開始時看起來非常簡單。

但是代碼執行任何操作。我想從JPA persistence.xml文件初始化Hibernate,我認爲這是問題所在。

目前我已經手動設置mysql屬性,但Hibernate沒有找到實體類。

從JPA配置獲取配置(SchemaUpdate類所需)的最佳方式是什麼?

我已經搜索了一段時間的解決方案,但所有人都使用EJB3Configuration類,而這個類在Hibernate 4.3中不再存在。

Thaks求助!

例如,我在做這樣的事情:

final File persistenceFile = new File("src/main/resources/META-INF/persistence.xml"); 

final Configuration cfg = new Configuration(); 

if (! persistenceFile.exists()) { 

    throw new FileNotFoundException(persistenceFile.getAbsolutePath() + " not found"); 
} 

final List<String> jpaConfiguration = Files.readLines(persistenceFile, Charsets.UTF_8); 

for (final String line : jpaConfiguration) { 

    if (line.contains("property")) { 

     final String[] props = line.split("\\\""); 

     cfg.setProperty(props[1], props[3]); 
    } 

} 

final SchemaUpdate updater = new SchemaUpdate(cfg); 

updater.setOutputFile("target/script.sql"); 

updater.execute(true, false); 
+0

我已經通過手動查找源目錄中的實體並使用addAnnotatedClass()方法解決了該問題。 – user2810476

回答

2

這個解決方案有一個缺點。如果有的話,你還必須包含'package-info.java'。有一個更簡單的解決方案(至少現在)。

HibernatePersistenceProvider可以產生EntityManagerFactoryBuilderEntityManagerFactoryBuilderImpl具有的功能給予配置回來。不幸的是,這個函數是受保護的,因此必須派生出HibernatePersistenceProvider。

private class MyHibernatePersistence extends HibernatePersistenceProvider { 

    @Override 
    public EntityManagerFactoryBuilder getEntityManagerFactoryBuilderOrNull(String persistenceUnitName, Map properties) { 
     return super.getEntityManagerFactoryBuilderOrNull(persistenceUnitName, properties); 
    } 
} 

這可以很容易地創建一個配置,它考慮到所有的數據,這也是用於一個EntityManager。

public Configuration getConfiguration(String persistenceUnitName, Map<String, Object> properties) { 
    MyHibernatePersistence hpp = new MyHibernatePersistence(); 
    EntityManagerFactoryBuilder emfb = hpp.getEntityManagerFactoryBuilderOrNull(persistenceUnitName, properties)); 
    if (emfb instanceof EntityManagerFactoryBuilderImpl) { 
     emfb.build(); 
     return ((EntityManagerFactoryBuilderImpl) emfb).getHibernateConfiguration(); 
    } 
    return null; 
} 
+0

我測試了這個,它的工作原理。這是習慣用法還是其他更簡單的方法? – k1eran