Bonjour !

J'essaie comme le titre l'indique de gérer dynamiquement différentes connexions à plusieurs bases de données en passant d'un persistence-unit à un autre...

C'est en relation avec un précédent sujet : Même App web pour différents clients/bases de données

Donc chaque base correspond à un client, et donc aux données le concernant pour la même application que j'ai développée...

Dans mon persistence.xml :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
 
<?xml version="1.0" encoding="UTF-8"?>
<persistence version="2.0" xmlns="http://java.sun.com/xml/ns/persistence" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_2_0.xsd">
  <persistence-unit name="Client1PU" transaction-type="JTA">
    <jta-data-source>jdbc/jclient1</jta-data-source>
    <shared-cache-mode>NONE</shared-cache-mode>
    <properties/>
  </persistence-unit>
  <persistence-unit name="Client2PU" transaction-type="JTA">
    <jta-data-source>jdbc/jclient2</jta-data-source>
    <shared-cache-mode>NONE</shared-cache-mode>
    <properties/>
  </persistence-unit>
</persistence>
En fait, j'ai une page de login (login.jsf) dans laquelle je choisis le Client que je suis, et donc la base de données à laquelle je vais me connecter :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
 
<h:form>
    <h:panelGrid columns="2" style="margin-top: 20px;" columnClasses="labelCol, inputCol" cellpadding="5">
        <h:outputText value="Site :" />
        <h:selectOneMenu value="#{utilisateurSession.persistenceUnit}">
            <f:selectItem itemValue="Client1PU" itemLabel="Je suis le Client 1" />
            <f:selectItem itemValue="Client2PU" itemLabel="Je suis le Client 2" />
        </h:selectOneMenu>
        <h:outputText value="Identifiant :" />
        <h:inputText value="#{utilisateurSession.login}" maxlength="20" size="20" />
        <h:outputText value="Mot de passe :" />
        <h:inputSecret value="#{utilisateurSession.password}" maxlength="20" size="20" />
        <h:commandButton value="Se connecter" action="#{utilisateurSession.doConnect}" />
    </h:panelGrid>
</h:form>
et le managed-bean qui recupère les infos :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
 
@ManagedBean
@SessionScoped
public class UtilisateurSession implements Serializable {
    @EJB
    private UtilisateurFacadeLocal ejb;
    private Utilisateur utilisateur = null;
    private String persistenceUnit;
    private String login;
    private String password;
 
    public String doConnect() {
        String navigateTo = null;
        try {
            utilisateur = ejb.authenticate(login, password);
            navigateTo = "home";
        } catch (Exception e) {
            addMessage(e);
        }
        return navigateTo;
    }
 
}
Ainsi dans mes beans de session, j'essaie un "truc" comme cela :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
@Stateless
public class UtilisateurFacade extends AbstractFacade<Utilisateur> implements UtilisateurFacadeLocal {

    private EntityManager em;

    @Override
    protected EntityManager getEntityManager() {
        return em;
    }

    public UtilisateurFacade() {
        super(Utilisateur.class);
        UtilisateurSession account = (UtilisateurSession) FacesContext.getCurrentInstance().getExternalContext().getSessionMap().get("utilisateurSession");
        em = Persistence.createEntityManagerFactory(account.getPersistenceUnit()).createEntityManager();
    }

    @Override
    public Utilisateur authenticate(String login, String password) {

        Query query = em.createNamedQuery("Utilisateur.findByIdentifiant");
        query.setParameter("identifiant", login);

        Utilisateur utilisateur;
        try {
            utilisateur = (Utilisateur) query.getSingleResult();
        } catch (Exception e) {
            throw new ValidationException("Identifiant inconnu !");
        }

        // on vérifie le mot de passe si l'utilisateur existe
        if (utilisateur != null) {
            utilisateur.matchPassword(password);
        }

        return utilisateur;
    }
}
afin de créer "dynamiquement" ma connexion à la base...
Mais au final... ça plante !


Donc comment pourais-je procéder ? Y-a-t-il une meilleure méthode ?

Je vous remercie de vos propositions