2010-02-22 6 views
17

J'ai une application utilisant des servlets Java/JSP. Plusieurs clients utilisent mon application, mais chaque client possède une base de données distincte. Toutes les bases de données ont le même schéma. Je voudrais déterminer quelle connexion de base de données utiliser au moment où un utilisateur se connecte au système. Par exemple le client A se connecte, je détermine que le client A appartient à la base de données C, récupère la connexion pour la base de données C et continue sur ma voie. J'utilise JPA avec Hibernate comme fournisseur JPA. Est-il possible de le faire en utilisant plusieurs unités de persistance et en déterminant quelle unité utiliser lors de la connexion? Y a-t-il une meilleure façon de faire cela? J'utilise des annotations et des EJB pour que le contexte de persistance soit défini dans l'EJB avec @PersistenceContext (unitName = "blahblah"), cela peut-il être déterminé au moment de la connexion? Puis-je changer le nom de l'unité à l'exécution?Comment me connecter à plusieurs bases de données en utilisant JPA?

Merci

Répondre

16

1) Créer plusieurs unités persistantes dans votre persistence.xml avec des noms différents.

2) Créer un nombre nécessaire de EntityManagerFactory s (1 par persistence-unit) et spécifier quelle persistance unité doit être utilisée pour fabrique du béton:

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

3) Créer un nombre nécessaire de TransactionManager s:

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

4) Dans votre classes de DAO spécifient avec laquelle la persistance unité (et donc avec laquelle EntityManagerFactory) vous voulez travailler:

public class AbstractAuthDao<T> { 

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

    ... 
} 

5) Dans vos objets de service qui TransactionManager-spécifier doit être utilisé (cette fonction est uniquement pris en charge au printemps 3.0):

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

    ... 
} 

6) Si vous avez OpenEntityManagerInViewFilter dans votre web.xml, puis spécifiez dans son nom init-param de EntityManagerFactory nécessaire (ou créer plusieurs filtres avec des blocs init correspondants):

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

Qui a dit que l'OP utilise Spring? :) –

+0

J'ai fait cette suggestion avant que la question soit éditée. – Roman

+0

Pour être juste, je n'ai jamais mentionné le printemps dans le post original non plus, le montage a simplement ajouté plus d'infos, mais cela m'a conduit à une réponse qui semble être du travail, donc elle a été acceptée. – kgrad

Questions connexes