是否可以通过配置覆盖persistence.xml属性?

时间:2010-01-19 14:35:09

标签: java jpa ejb-3.0

JBOSS 5.1 / EJB 3 / JPA / MySQL

对于开发,我们将“hibernate.hbm2ddl.auto”指定为“update”。这是在几个嵌入在几个罐子里的persistence.xml文件中完成的。

对于生产,我们要覆盖它以指定“验证”。

这可以通过耳外的配置完成吗?

(我知道可以在非托管环境中的代码中执行此操作)

3 个答案:

答案 0 :(得分:4)

对于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

答案 1 :(得分:1)

对于独立的hibernate,它很容易做到,当你创建持久性对象时,你可以传递一个键值对的哈希表。在您的情况下,键“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;
}

然后,我的配置类会使用自定义配置文件中的内容填充Map。

我不相信你可以修改已经打开的EntityManager实例。虽然你可以通过EntityManager传递一个Map,但是我发现它忽略了这些属性,只有当你从工厂做到这一点时才注意...

答案 2 :(得分:0)

对于Wildfly,我建议您persistence.xml根本没有hibernate.hbm2ddl.auto属性。

相反,在用于开发VM参数的开发的启动器配置中,将-Dhibernate.hbm2ddl.auto=update添加到列表中。

您也可以在生产环境中使用-Dhibernate.hbm2ddl.auto=validate,但至少可以将更改保留在应用程序之外。