我的Web框架(Play 1.2.5)创建了一个EJB3Configuration,它用于创建EntityManagerFactory
(source)的方法。我正在编写一个脚本,并希望从Configuration运行generateSchemaUpdateScript()
方法来生成我可以在生产部署上验证和运行的SQL脚本。我遇到的问题是,在构建EntityManagerFactory
之后,我无法弄清楚如何访问所使用的Configuration对象或如何生成Configuration对象。
答案 0 :(得分:7)
您无法从entitymanagerfactory获取配置对象,因为hibernate实现EntityManagerFactoryImpl不包含对配置对象的引用
您的选择
答案 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架构更新。看起来这就是你想要的!