3

我正在尝试基于 Hibernate 提供的 SchemaUpdate 类编写一个 Liquibase 变更集生成器。目标是获得 Hibernate 更新脚本的好处以及开发人员根据需要调整它们的可能性。完成后,SQL 将被集成到 Liquibase SQL 文件中。

一开始这似乎很简单,只需实例化一个 SchemaUpdate 类并启动 execute 方法。

但是代码可以做任何事情。我正在尝试从 JPA persistence.xml 文件初始化 Hibernate,我认为这就是问题所在。

目前我已经手动设置了 mysql 属性,但是 Hibernate 没有找到实体类。

从 JPA 配置中获取配置(SchemaUpdate 类需要)的最佳方法是什么?

我已经搜索了一段时间的解决方案,但是它们都使用 EJB3Configuration 类,该类在 Hibernate 4.3 中不再存在。

谢谢帮助!

例如,我正在做这样的事情:

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

1 回答 1

2

该解决方案有一个缺点。如果有,您还必须包含“package-info.java”。有一个更简单的解决方案(至少现在是这样)。

HibernatePersistenceProvider可以生成EntityManagerFactoryBuilder并且 EntityManagerFactoryBuilderImpl具有返回Configuration的功能。不幸的是,这个函数是受保护的,所以必须派生 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;
}
于 2014-10-04T17:52:36.593 回答