JBOSS 5.1/EJB 3/JPA/MySQL是否有可能通过配置覆盖persistence.xml属性?
对于开发,我们将“hibernate.hbm2ddl.auto”指定为“update”。这是在几个persistence.xml文件中嵌入耳朵中的几个瓶子中完成的。
对于生产,我们希望覆盖它以指定“验证”。
这可以通过外部配置来完成吗?
(我知道这是可能做到这一点的代码在非托管环境)
JBOSS 5.1/EJB 3/JPA/MySQL是否有可能通过配置覆盖persistence.xml属性?
对于开发,我们将“hibernate.hbm2ddl.auto”指定为“update”。这是在几个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”和“验证”的价值...
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实例。虽然你可以通过EntityManager的一个地图,我发现,它忽略了这些属性,当你从工厂做到了只重视...
对于Wildfly,我会建议您的persistence.xml
根本没有hibernate.hbm2ddl.auto
属性。
取而代之的是,在您的启动程序配置中,要传递VM参数的开发中,将-Dhibernate.hbm2ddl.auto=update
添加到列表中。
对于您的生产环境,您也可以拥有-Dhibernate.hbm2ddl.auto=validate
,但至少可以将这些更改保留在应用程序之外。
好的 - 那有效。澄清:在jar/wars/ear中的persistence.xml覆盖这个文件。因此,您需要更新persistence.xml文件,以便它们不包含(例如)hibernate.hbm2ddl.auto属性。 – Conor 2010-01-21 16:41:19
是的,我发现不要在persistence.xml中设置这些属性,除非它们在开发和生产中相同。 – mtpettyp 2010-01-21 16:45:49