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 :
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 <?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>
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 <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>
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 @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; } }
afin de créer "dynamiquement" ma connexion à la base...
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; } }
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
![]()
Partager