2010-02-22 67 views
17

我有一個使用Java servlets/JSP的應用程序。有多個客戶端使用我的應用程序,但每個客戶端都有一個單獨的數據庫。所有的數據庫都有相同的模式。我想確定在用戶登錄系統時使用哪個數據庫連接。如何使用JPA連接到多個數據庫?

例如,客戶端A登錄,我確定客戶端A屬於數據庫C,抓住數據庫C的連接並繼續我的快樂方式。

我正在使用JPA與Hibernate作爲我的JPA提供程序。是否有可能使用多個持久性單元執行此操作並確定在登錄時使用哪個單元?有沒有更好的/首選的方法來做到這一點?

修改爲添加: 我使用註釋和EJB,因此Persistence Context正在使用@PersistenceContext(unitName =「blahblah」)在EJB中設置,這可以在登錄時確定嗎?我可以在運行時更改unitName嗎?

感謝

回答

16

1)不同的名稱創建您的persistence.xml幾個持久單位。

2)創建的EntityManagerFactory S(1每持久性單元)必要數量和指定應用於混凝土廠,其持久性單元:

<bean id="authEntityManagerFactory" class="org.springframework.orm.jpa.LocalEntityManagerFactoryBean"> 
    <property name="persistenceUnitName" value="SpringSecurityManager"/> 
</bean> 

3)創建的TransactionManager小號必要數量:

<bean id="authTransactionManager" class="org.springframework.orm.jpa.JpaTransactionManager"> 
    <property name="entityManagerFactory" ref="authEntityManagerFactory" /> 
</bean> 

4)在你的DAO的類指定與持久化單元(等與EntityManagerFactory的),你想工作:

public class AbstractAuthDao<T> { 

    @PersistenceContext (unitName = "SpringSecurityManager") 
    protected EntityManager em; 

    ... 
} 

5)在服務對象指定事務管理器應使用(此功能只支持在Spring 3.0):

@Transactional (value = "authTransactionManager", readOnly = true) 
public class UserServiceImpl implements UserService { 

    ... 
} 

6)如果你在你的web.xml有OpenEntityManagerInViewFilter,然後指定其必需的EntityManagerFactory的init-param名稱(或創建幾個帶有相應init-blocks的過濾器):

<init-param> 
    <param-name>entityManagerFactoryBeanName</param-name> 
    <param-value>authEntityManagerFactory</param-value> 
</init-param> 
+0

誰說OP使用Spring? :) –

+0

我在編輯問題之前提出了這個建議。 – Roman

+0

公平起見,我從來沒有在原帖中提到過Spring,編輯只是添加了更多信息,但是這引出了一個似乎是工作的答案,所以它已被接受。 – kgrad