Gérer dynamiquement les "persistence-unit"
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:
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:
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:
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:
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
:)