2010-01-19 81 views
2

JBOSS 5.1/EJB 3/JPA/MySQL是否有可能通過配置覆蓋persistence.xml屬性?

對於開發,我們將「hibernate.hbm2ddl.auto」指定爲「update」。這是在幾個persistence.xml文件中嵌入耳朵中的幾個瓶子中完成的。

對於生產,我們希望覆蓋它以指定「驗證」。

這可以通過外部配置來完成嗎?

(我知道這是可能做到這一點的代碼在非託管環境)

回答

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

+0

好的 - 那有效。澄清:在jar/wars/ear中的persistence.xml覆蓋這個文件。因此,您需要更新persistence.xml文件,以便它們不包含(例如)hibernate.hbm2ddl.auto屬性。 – Conor 2010-01-21 16:41:19

+0

是的,我發現不要在persistence.xml中設置這些屬性,除非它們在開發和生產中相同。 – mtpettyp 2010-01-21 16:45:49

1

對於獨立冬眠它很容易做到,當你創建持久性對象,你可以通過它鍵 - 一個哈希表值對。你的情況的關鍵「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的一個地圖,我發現,它忽略了這些屬性,當你從工廠做到了只重視...

+0

是 - 在非託管環境中,您可以執行此操作。但是當你獲得EntityManager時,你如何在託管環境(例如JBOSS)中執行它:@PersistenceContext private EntityManager em; – Conor 2010-01-19 14:40:43

+0

@conor阿好吧,這是有道理的... EM連接已經爲你打開? – Petriborg 2010-01-19 14:52:49

+0

是的 - 它是由JBoss注入的。 – Conor 2010-01-19 15:01:46

0

對於Wildfly,我會建議您的persistence.xml根本沒有hibernate.hbm2ddl.auto屬性。

取而代之的是,在您的啓動程序配置中,要傳遞VM參數的開發中,將-Dhibernate.hbm2ddl.auto=update添加到列表中。

對於您的生產環境,您也可以擁有-Dhibernate.hbm2ddl.auto=validate,但至少可以將這些更改保留在應用程序之外。

相關問題