Hibernate 4.3 SchemaUpdate与JPA

3
我正在尝试编写一个基于Hibernate提供的SchemaUpdate类的Liquibase changeset生成器。目标是利用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);

我通过手动在源目录中查找实体并使用addAnnotatedClass()方法来绕过问题。 - user2810476
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);
    }
}

这可以很容易地创建一个配置,考虑到所有数据,这些数据也用于实体管理器。

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

我测试过了,它可以正常工作。这是惯用的方法吗?还有没有更简单的方式来实现同样的效果? - k1eran

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接