我正在尝试编写基于Hibernate提供的SchemaUpdate类的Liquibase变更集生成器。 目标是获得Hibernate更新脚本的好处,以及开发人员根据需要调整它们的可能性。 完成后,SQL将在Liquibase SQL文件中进行集成。
这一开始看起来非常简单,通过实现SchemaUpdate类并启动execute方法。
但代码可以做任何事情。我试图从JPA persistence.xml文件初始化Hibernate,我认为这是问题所在。
目前我手动设置了mysql属性,但Hibernate没有找到实体类。
从JPA配置获取配置(SchemaUpdate类所需)的最佳方法是什么?
我已经搜索了一段时间的解决方案,但所有这些都使用了在Hibernate 4.3中不再存在的EJB3Configuration类。
寻求帮助!
例如,我正在做这样的事情:
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 :(得分:2)
这种解决方案有一个缺点。您还必须包含'package-info.java'(如果有)。有一个更简单的解决方案(至少现在)。
HibernatePersistenceProvider 可以生成 EntityManagerFactoryBuilder , EntityManagerFactoryBuilderImpl 具有返回配置的功能。不幸的是,这个函数是受保护的,所以必须派生HibernatePersistenceProvider。
private class MyHibernatePersistence extends HibernatePersistenceProvider {
@Override
public EntityManagerFactoryBuilder getEntityManagerFactoryBuilderOrNull(String persistenceUnitName, Map properties) {
return super.getEntityManagerFactoryBuilderOrNull(persistenceUnitName, properties);
}
}
这可以很容易地创建一个Configuration,它考虑了所有数据,这些数据也用于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;
}