6

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

4

2 回答 2

7

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

你的选择是

  • 在您的脚本中复制来自 JPAPlugin 的代码以创建您自己的配置对象
  • 配置休眠工具以处理您的类。我自己从未使用过这个工具,但我想正确配置他可以为你生成 ddl
  • 从您的数据库生成回 ddl 脚本
于 2012-09-11T08:55:04.267 回答
2

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

我指的是 Hibernate 3.6.8 源和 EJB3Configuration 类有方法

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

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

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

这在此处的 javadocs 中进行了解释

调用#buildEntityManagerFactory() 后,您不再可以更改配置状态(不添加类,不更改属性等)

话虽如此,您要实现的目标是严格不建议做的事情,尤其是在生产数据库上。看这里

Hibernate 有一个名为“hibernate.hbm2ddl.auto”的属性,用于在不断发展的脚本的情况下帮助模式自动生成。您尝试以编程方式实现的效果与在持久性 xml 中为其赋予更新值相同的效果,如下所示。实际上,当您将“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>

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

但是,Hibernate 文档严格建议不要将其用于生产数据库。

关于 Hibernate 的权威书籍“Java persistence with Hibernate”警告了这一点

警告我们已经看到 Hibernate 用户尝试使用 SchemaUpdate 自动更新生产数据库的模式。这可能很快以灾难告终,并且您的 DBA 不允许这样做。

以及关于更新模式过程的一些限制

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

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

更新 2

此处列出的示例代码显示了在为游戏应用程序创建数据库迁移时如何使用 Hibernate 模式更新。好像这就是你想要的!

于 2012-09-13T13:19:36.913 回答