2014-05-07 141 views
1

我正在嘗試開發一個使用java EE的網站,該網站將部署到遠程服務器,我正在嘗試將JPA應用到應用程序中。
出於測試目的,我想創建一個變量持久性單元,以便在本地部署時,應用程序將使用我的本地mySQL服務器,而在遠程部署時,它將使用服務器提供的mySQL服務器。然而,問題是我在glassfish本地運行,而jboss遠程,所以我不能讓數據源的資源JNDI名稱相同(因爲jboss需要「java:/」或「java:jboss」 /」作爲前綴,而GlassFish中不允許:的在JNDI名稱)JPA可變持久性單元

的另一個問題是,我不是簡單地不允許創建具有相同名稱的2個持久性單元,
我試過做2個不同的持久性單元,但是由於其中一個持久性單元無法解析,部署失敗。下面

是我此時的persistence.xml:

<persistence-unit name="LocalPU"> 
    <provider>org.eclipse.persistence.jpa.PersistenceProvider</provider> 
    <jta-data-source>jdbc/website</jta-data-source> 
    <properties> 
     <property name="eclipselink.ddl-generation" value="drop-and-create-tables"/> 
     <property name="eclipselink.ddl-generation.output-mode" value="both"/> 
    </properties> 
     </persistence-unit> 

<persistence-unit name="RemotePU"> 
    <provider>org.eclipse.persistence.jpa.PersistenceProvider</provider> 
    <jta-data-source>java:/website</jta-data-source> 
    <properties> 
     <property name="eclipselink.ddl-generation" value="drop-and-create-tables"/> 
     <property name="eclipselink.ddl-generation.output-mode" value="both"/> 
    </properties> 
</persistence-unit> 

所以我的問題是,是否有可能有一個EntityManager解決這些持久化單元的任一,但不要求兩個持久性單元都可用

編輯:

張貼這個問題

約5分鐘後,我發現,建議使用環境變量

然而,這似乎並沒有爲GlassFish中工作的文章,

這個persistence.xml中:

<persistence-unit name="LocalPU"> 
     <provider>org.eclipse.persistence.jpa.PersistenceProvider</provider> 
     <jta-data-source>${myds}</jta-data-source> 
     <properties> 
      <property name="eclipselink.ddl-generation" value="drop-and-create-tables"/> 
      <property name="eclipselink.ddl-generation.output-mode" value="both"/> 
     </properties> 
</persistence-unit> 

並且JVM選項-Dmyds=jndi/website導致以下錯誤:

Exception while preparing the app : Invalid resource : ${myds}__pm 
com.sun.appserv.connectors.internal.api.ConnectorRuntimeException: Invalid resource : ${myds}__pm 

w這使我相信環境變量不能在玻璃魚內解析(???)

+0

有相同的結果我不確定爲什麼你需要使用java:/網站在JBoss中,因爲這是服務器之間相當一致的東西。如果底層的命名方案不同,那麼將會做些什麼,比如在persistence.xml中使用一個常量名,例如jdbc/website,然後用服務器特定的部署描述符中的resource-ref鏈接對其進行更正。請參閱http://docs.jboss.org/jbossas/jboss4guide/r1/html/ch3.chapter.html#ch3.ejbref.ex和http://docs.oracle.com/cd/E18930_01/html/821-2418 /beaoa.html – Chris

+0

您提供的第二個鏈接爲我提供了一個方便的深入瞭解glassfish中的問題 「java:」前綴是隱含的,所以在我使用「jdbc/website」時它實際上被解析爲「java :jdbc/website「 因此,使用」jboss/datasources/MySQLDS「並重命名glassfish內的引用應該(理論上)工作 –

回答

0

在按照上面第一條評論提供的提示之後,我得出結論,這個問題是無關緊要的,而且我的問題是由我誤解了glassfish,jboss和JPA之間JNDI名稱的顯示/解析方式不同(在我的情況下,由於openshift的Jboss服務器竟然不支持eclipselink,因此它不支持eclipselink)

Glassfish,命名爲JNDI資源爲jdbc/website,但解析爲java:jdbc/website

另一方面,Jboss需要定義「java:」前綴因此爲了尋找相同的數據源,它應該被命名爲java:jdbc/website

我不完全確定JPA/Java EE如何在內部解析JNDI名稱,但它看起來好像兩個版本都有效,所以兩者java:jdbc/websitejdbc/website將成功連接到glassfish和jboss環境中定義的數據源。 至少我已經能夠使用java:jdbc/website數據源名稱成功構建到jboss和glassfish,並且我已經與jdbc/website