在构建EntityManagerFactory后如何获得Hibernate配置?

时间:2012-09-07 14:56:55

标签: java hibernate playframework playframework-1.x

我的Web框架(Play 1.2.5)创建了一个EJB3Configuration,它用于创建EntityManagerFactory (source)的方法。我正在编写一个脚本,并希望从Configuration运行generateSchemaUpdateScript()方法来生成我可以在生产部署上验证和运行的SQL脚本。我遇到的问题是,在构建EntityManagerFactory之后,我无法弄清楚如何访问所使用的Configuration对象或如何生成Configuration对象。

2 个答案:

答案 0 :(得分:7)

您无法从entitymanagerfactory获取配置对象,因为hibernate实现EntityManagerFactoryImpl不包含对配置对象的引用

您的选择

  • 在脚本中复制JPAPlugin中的代码以创建自己的配置对象
  • 配置hibernate工具以处理您的类。我自己从未使用过这个工具,但我想正确配置他可以为你生成ddl
  • 从您的数据库生成ddl脚本

答案 1 :(得分:2)

创建实体管理器工厂后,您不应该拥有配置对象的句柄,部分原因是配置应该表现出不可变行为的设计,因为您无法更改其属性。

我指的是Hibernate 3.6.8源代码,EJB3Configuration类代表方法

public AnnotationConfiguration getHibernateConfiguration() {
        //TODO make it really read only (maybe through proxying)
        return cfg;
    }

AnnotationConfiguration被声明为已弃用,因为它的所有功能都已移至Configuration类。

所以我认为使用它可以在创建配置后获得配置。您必须非常小心,但不要更改该配置中的任何内容。

这在javadocs here

中有解释
  

在调用了#buildEntityManagerFactory()之后,你再也无法做到了   更改配置状态(没有类添加,没有属性更改   等)

话虽如此,你想要做的事情是严格不建议,特别是在生产数据库上。见here

Hibernate有一个名为“hibernate.hbm2ddl.auto”的属性,用于在发展脚本的情况下协助模式自动生成。您尝试以编程方式实现的内容具有相同的效果,就像在持久性xml中为其提供 update 的值一样。事实上,当你将“hibernate.hbm2ddl.auto”的值设置为“update”时,配置会调用generateSchemaUpdateScript方法

<persistence xmlns="http://java.sun.com/xml/ns/persistence"
             xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
             xsi:schemaLocation="http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_2_0.xsd"
             version="2.0">
   <persistence-unit name="xyz" transaction-type="RESOURCE_LOCAL">
        <properties>
            ....................
            <property name="hibernate.hbm2ddl.auto" value="update"/>
            ......................
        </properties>
    </persistence-unit>
</persistence>

您可以参考此属性的其他可能值here

然而,Hibernate文档严格建议不要在生产数据库中使用它。

关于Hibernate“使用Hibernate进行Java持久化”的权威书籍提醒注意这个

  

警告我们已经看到Hibernate用户尝试使用SchemaUpdate   自动更新生产数据库的模式。这个可以   快速结束灾难,你的DBA不会允许。

并且对更新架构流程的限制也很少

  

此配置属性update的附加选项可以是   在开发过程中很有用:它启用了内置的SchemaUpdate工具,   这可以使架构演变更容易。如果启用,Hibernate会读取   启动时的JDBC数据库元数据并创建新表和   通过比较旧模式和当前映射来进行约束   元数据。请注意,此功能取决于的质量   JDBC驱动程序提供的元数据,其中有许多驱动程序   缺乏。实际上,这个功能因此不那么令人兴奋   听起来很有用。

更新1:如果您无权访问EJB3Configuration,并且您的最终目标是为JPA带注释的实体创建更新架构脚本,那么您可以使用编程方式在java主类中创建EJB3Configuration持久性xml文件,其中包含数据库的配置详细信息并运行架构导出工具。请参阅this示例,了解如何执行此操作。因此,您可以在框架之外的JPA实体甚至容器上运行该工具。

更新2

列出的示例代码here显示了在为播放应用程序创建数据库迁移时如何使用Hibernate架构更新。看起来这就是你想要的!