【发布时间】:2010-01-19 14:35:09
【问题描述】:
JBOSS 5.1 / EJB 3 / JPA / MySQL
对于开发,我们将“hibernate.hbm2ddl.auto”指定为“update”。这是在几个 jar 中嵌入的几个 persistence.xml 文件中完成的。
对于生产,我们希望覆盖它以指定“验证”。
这可以通过耳朵外部的配置来完成吗?
(我知道在非托管环境中的代码中可以做到这一点)
【问题讨论】:
JBOSS 5.1 / EJB 3 / JPA / MySQL
对于开发,我们将“hibernate.hbm2ddl.auto”指定为“update”。这是在几个 jar 中嵌入的几个 persistence.xml 文件中完成的。
对于生产,我们希望覆盖它以指定“验证”。
这可以通过耳朵外部的配置来完成吗?
(我知道在非托管环境中的代码中可以做到这一点)
【问题讨论】:
对于 JBoss 5.1,需要编辑以下文件:
<jboss_dir>/server/default/deployers/ejb3.deployer/META-INF/jpa-deployers-jboss-beans.xml
<bean name="PersistenceUnitDeployer" class="org.jboss.jpa.deployers.PersistenceUnitDeployer">
<property name="defaultPersistenceProperties">
<map keyClass="java.lang.String" valueClass="java.lang.String">
<entry>
<key>hibernate.transaction.manager_lookup_class</key>
<value>org.hibernate.transaction.JBossTransactionManagerLookup</value>
</entry>
<entry>
<key>hibernate.hbm2ddl.auto</key>
<value>validate</value>
</entry>
<entry>
<key>hibernate.cache.provider_class</key>
<value>org.hibernate.cache.HashtableCacheProvider</value>
</entry>
<entry>
<key>hibernate.jndi.java.naming.factory.initial</key>
<value>org.jnp.interfaces.NamingContextFactory</value>
</entry>
<entry>
<key>hibernate.jndi.java.naming.factory.url.pkgs</key>
<value>org.jboss.naming:org.jnp.interfaces</value>
</entry>
<entry>
<key>hibernate.bytecode.use_reflection_optimizer</key>
<value>false</value>
</entry>
<!-- I don't think this is honored, but EJB3Deployer uses it -->
<entry>
<key>hibernate.bytecode.provider</key>
<value>javassist</value>
</entry>
</map>
</property>
</bean>
这些属性可以在 JBoss 4.2 的以下文件中编辑:
<jboss_dir>/server/default/deploy/ejb3.deployer/META-INF/persistence.properties
【讨论】:
对于独立休眠它很容易做到,当您创建持久对象时,您可以将键值对的哈希表传递给它。在您的情况下,键“hibernate.hbm2dll.auto”和“validate”的值...
private Map properties = Util.newMap();
public EntityManagerFactory getEntityManagerFactory() {
if (emf == null || !emf.isOpen()) {
emf = Persistence.createEntityManagerFactory(PU, properties);
}
return emf;
}
public EntityManager getEntityManager() {
if (em == null || !em.isOpen()) {
em = getEntityManagerFactory().createEntityManager();
}
return em;
}
然后我会让我的配置类使用我的自定义配置文件中的内容填充地图。
我不相信您可以修改已经打开的 EntityManager 实例。尽管您可以将 Map 传递给 EntityManager,但我发现它忽略了这些属性,并且仅在您从工厂执行此操作时才注意...
【讨论】:
对于 Wildfly,我建议您的 persistence.xml 根本没有 hibernate.hbm2ddl.auto 属性。
相反,在传递 VM 参数的开发启动器配置中,将 -Dhibernate.hbm2ddl.auto=update 添加到列表中。
您也可以将-Dhibernate.hbm2ddl.auto=validate 用于您的生产环境,但至少这会将更改保留在您的应用程序之外。
【讨论】: