2013-10-28 127 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