【问题标题】:Is it possible to override persistence.xml properties via configuration?是否可以通过配置覆盖 persistence.xml 属性?
【发布时间】:2010-01-19 14:35:09
【问题描述】:

JBOSS 5.1 / EJB 3 / JPA / MySQL

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

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

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

(我知道在非托管环境中的代码中可以做到这一点)

【问题讨论】:

    标签: java jpa ejb-3.0


    【解决方案1】:

    对于 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 的以下文件中编辑:

    &lt;jboss_dir&gt;/server/default/deploy/ejb3.deployer/META-INF/persistence.properties

    【讨论】:

    • 好的 - 这行得通。澄清一下:jars/wars/ear 中的 persistence.xml 覆盖了这个文件。所以你需要更新 persistence.xml 文件,使它们不包含(例如)hibernate.hbm2ddl.auto 属性。
    • 是的,我发现永远不要在 persistence.xml 中设置这些属性是一种很好的做法,除非它们在开发和生产中是相同的。
    【解决方案2】:

    对于独立休眠它很容易做到,当您创建持久对象时,您可以将键值对的哈希表传递给它。在您的情况下,键“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,但我发现它忽略了这些属性,并且仅在您从工厂执行此操作时才注意...

    【讨论】:

    • 是的 - 在非托管环境中,您可以执行此操作。但是当像这样获得 EntityManager 时,你如何在托管环境(例如 JBOSS)中做到这一点:@PersistenceContext private EntityManager em;
    • @conor 好吧,这很有道理... EM 连接已经为您打开了吗?
    • 是的 - 它是由 JBoss 注入的。
    • @conor 啊,那么我不确定你怎么能做到这一点,也许是通过 JBoss?我自己不使用 JBoss - 我们的休眠数据库应用程序是独立的。
    【解决方案3】:

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-08-17
      • 2012-02-12
      • 1970-01-01
      相关资源
      最近更新 更多