IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

JPA Java Discussion :

Gérer dynamiquement les "persistence-unit"


Sujet :

JPA Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé Avatar de kimausoleil
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2004
    Messages
    126
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Saône et Loire (Bourgogne)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Février 2004
    Messages : 126
    Par défaut 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 : 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


  2. #2
    Membre averti
    Profil pro
    Inscrit en
    Décembre 2008
    Messages
    20
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2008
    Messages : 20
    Par défaut
    bonjour,

    qu'entendez-vous par "ça plante" ??... il doit bien y avoir une stacktrace qui peut nous renseigner un peu plus sur ce "plantage"

  3. #3
    Membre confirmé Avatar de kimausoleil
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2004
    Messages
    126
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Saône et Loire (Bourgogne)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Février 2004
    Messages : 126
    Par défaut
    Oui désolé... si je n'ai rien décrit, c'est que je sens bien que c'est pas du tout "académique" d'appeler un managed-bean session scope dans un bean de session stateless .

    En fait, dès que je déploie sur Glassfish j'ai cette erreur :
    GRAVE: PWC2768: IOException while loading persisted sessions: java.io.InvalidClassException: controller.UtilisateurSession; local class incompatible: stream classdesc serialVersionUID = 9183840310866678431, local class serialVersionUID = 3053119823564742594
    java.io.InvalidClassException: controller.UtilisateurSession; local class incompatible: stream classdesc serialVersionUID = 9183840310866678431, local class serialVersionUID = 3053119823564742594

    at java.io.ObjectStreamClass.initNonProxy(ObjectStreamClass.java:562)
    at java.io.ObjectInputStream.readNonProxyDesc(ObjectInputStream.java:1583)
    at java.io.ObjectInputStream.readClassDesc(ObjectInputStream.java:1496)
    at java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:1732)
    at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1329)
    at java.io.ObjectInputStream.readObject(ObjectInputStream.java:351)
    at org.apache.catalina.session.StandardSession.readRemainingObject(StandardSession.java:1818)
    at org.apache.catalina.session.StandardSession.readObject(StandardSession.java:1750)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
    at java.lang.reflect.Method.invoke(Method.java:597)
    at java.io.ObjectStreamClass.invokeReadObject(ObjectStreamClass.java:974)
    at java.io.ObjectInputStream.readSerialData(ObjectInputStream.java:1849)
    at java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:1753)
    at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1329)
    at java.io.ObjectInputStream.readObject(ObjectInputStream.java:351)
    at org.apache.catalina.session.StandardSession.deserialize(StandardSession.java:1063)
    at org.apache.catalina.session.StandardManager.readSessions(StandardManager.java:511)
    at org.apache.catalina.session.StandardManager.doLoadFromFile(StandardManager.java:441)
    at org.apache.catalina.session.StandardManager.load(StandardManager.java:411)
    at org.apache.catalina.session.StandardManager.start(StandardManager.java:854)
    at org.apache.catalina.core.StandardContext.start(StandardContext.java:5270)
    at com.sun.enterprise.web.WebModule.start(WebModule.java:499)
    at org.apache.catalina.core.ContainerBase.addChildInternal(ContainerBase.java:928)
    at org.apache.catalina.core.ContainerBase.addChild(ContainerBase.java:912)
    at org.apache.catalina.core.StandardHost.addChild(StandardHost.java:694)
    at com.sun.enterprise.web.WebContainer.loadWebModule(WebContainer.java:1947)
    at com.sun.enterprise.web.WebContainer.loadWebModule(WebContainer.java:1619)
    at com.sun.enterprise.web.WebApplication.start(WebApplication.java:90)
    at org.glassfish.internal.data.EngineRef.start(EngineRef.java:126)
    at org.glassfish.internal.data.ModuleInfo.start(ModuleInfo.java:241)
    at org.glassfish.internal.data.ApplicationInfo.start(ApplicationInfo.java:236)
    at com.sun.enterprise.v3.server.ApplicationLifecycle.deploy(ApplicationLifecycle.java:339)
    at com.sun.enterprise.v3.server.ApplicationLoaderService.processApplication(ApplicationLoaderService.java:362)
    at com.sun.enterprise.v3.server.ApplicationLoaderService.postConstruct(ApplicationLoaderService.java:185)
    at com.sun.hk2.component.AbstractWombImpl.inject(AbstractWombImpl.java:174)
    at com.sun.hk2.component.ConstructorWomb$1.run(ConstructorWomb.java:87)
    at java.security.AccessController.doPrivileged(Native Method)
    at com.sun.hk2.component.ConstructorWomb.initialize(ConstructorWomb.java:84)
    at com.sun.hk2.component.AbstractWombImpl.get(AbstractWombImpl.java:77)
    at com.sun.hk2.component.SingletonInhabitant.get(SingletonInhabitant.java:58)
    at com.sun.hk2.component.LazyInhabitant.get(LazyInhabitant.java:107)
    at com.sun.hk2.component.AbstractInhabitantImpl.get(AbstractInhabitantImpl.java:60)
    at com.sun.enterprise.v3.server.AppServerStartup.run(AppServerStartup.java:236)
    at com.sun.enterprise.v3.server.AppServerStartup.start(AppServerStartup.java:128)
    at com.sun.enterprise.module.bootstrap.Main.launch(Main.java:457)
    at com.sun.enterprise.module.bootstrap.Main.launch(Main.java:401)
    at org.jvnet.hk2.osgiadapter.HK2Main.start(HK2Main.java:125)
    at org.apache.felix.framework.util.SecureAction.startActivator(SecureAction.java:640)
    at org.apache.felix.framework.Felix.activateBundle(Felix.java:1700)
    at org.apache.felix.framework.Felix.startBundle(Felix.java:1622)
    at org.apache.felix.framework.BundleImpl.start(BundleImpl.java:915)
    at org.jvnet.hk2.osgimain.Main.start(Main.java:140)
    at org.apache.felix.framework.util.SecureAction.startActivator(SecureAction.java:640)
    at org.apache.felix.framework.Felix.activateBundle(Felix.java:1700)
    at org.apache.felix.framework.Felix.startBundle(Felix.java:1622)
    at org.apache.felix.framework.Felix.setActiveStartLevel(Felix.java:1077)
    at org.apache.felix.framework.StartLevelImpl.run(StartLevelImpl.java:264)
    at java.lang.Thread.run(Thread.java:619)

    GRAVE: PWC2773: Exception loading sessions from persistent storage
    java.io.InvalidClassException: controller.UtilisateurSession; local class incompatible: stream classdesc serialVersionUID = 9183840310866678431, local class serialVersionUID = 3053119823564742594

    at java.io.ObjectStreamClass.initNonProxy(ObjectStreamClass.java:562)
    at java.io.ObjectInputStream.readNonProxyDesc(ObjectInputStream.java:1583)
    at java.io.ObjectInputStream.readClassDesc(ObjectInputStream.java:1496)
    at java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:1732)
    at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1329)
    at java.io.ObjectInputStream.readObject(ObjectInputStream.java:351)
    at org.apache.catalina.session.StandardSession.readRemainingObject(StandardSession.java:1818)
    at org.apache.catalina.session.StandardSession.readObject(StandardSession.java:1750)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
    at java.lang.reflect.Method.invoke(Method.java:597)
    at java.io.ObjectStreamClass.invokeReadObject(ObjectStreamClass.java:974)
    at java.io.ObjectInputStream.readSerialData(ObjectInputStream.java:1849)
    at java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:1753)
    at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1329)
    at java.io.ObjectInputStream.readObject(ObjectInputStream.java:351)
    at org.apache.catalina.session.StandardSession.deserialize(StandardSession.java:1063)
    at org.apache.catalina.session.StandardManager.readSessions(StandardManager.java:511)
    at org.apache.catalina.session.StandardManager.doLoadFromFile(StandardManager.java:441)
    at org.apache.catalina.session.StandardManager.load(StandardManager.java:411)
    at org.apache.catalina.session.StandardManager.start(StandardManager.java:854)
    at org.apache.catalina.core.StandardContext.start(StandardContext.java:5270)
    at com.sun.enterprise.web.WebModule.start(WebModule.java:499)
    at org.apache.catalina.core.ContainerBase.addChildInternal(ContainerBase.java:928)
    at org.apache.catalina.core.ContainerBase.addChild(ContainerBase.java:912)
    at org.apache.catalina.core.StandardHost.addChild(StandardHost.java:694)
    at com.sun.enterprise.web.WebContainer.loadWebModule(WebContainer.java:1947)
    at com.sun.enterprise.web.WebContainer.loadWebModule(WebContainer.java:1619)
    at com.sun.enterprise.web.WebApplication.start(WebApplication.java:90)
    at org.glassfish.internal.data.EngineRef.start(EngineRef.java:126)
    at org.glassfish.internal.data.ModuleInfo.start(ModuleInfo.java:241)
    at org.glassfish.internal.data.ApplicationInfo.start(ApplicationInfo.java:236)
    at com.sun.enterprise.v3.server.ApplicationLifecycle.deploy(ApplicationLifecycle.java:339)
    at com.sun.enterprise.v3.server.ApplicationLoaderService.processApplication(ApplicationLoaderService.java:362)
    at com.sun.enterprise.v3.server.ApplicationLoaderService.postConstruct(ApplicationLoaderService.java:185)
    at com.sun.hk2.component.AbstractWombImpl.inject(AbstractWombImpl.java:174)
    at com.sun.hk2.component.ConstructorWomb$1.run(ConstructorWomb.java:87)
    at java.security.AccessController.doPrivileged(Native Method)
    at com.sun.hk2.component.ConstructorWomb.initialize(ConstructorWomb.java:84)
    at com.sun.hk2.component.AbstractWombImpl.get(AbstractWombImpl.java:77)
    at com.sun.hk2.component.SingletonInhabitant.get(SingletonInhabitant.java:58)
    at com.sun.hk2.component.LazyInhabitant.get(LazyInhabitant.java:107)
    at com.sun.hk2.component.AbstractInhabitantImpl.get(AbstractInhabitantImpl.java:60)
    at com.sun.enterprise.v3.server.AppServerStartup.run(AppServerStartup.java:236)
    at com.sun.enterprise.v3.server.AppServerStartup.start(AppServerStartup.java:128)
    at com.sun.enterprise.module.bootstrap.Main.launch(Main.java:457)
    at com.sun.enterprise.module.bootstrap.Main.launch(Main.java:401)
    at org.jvnet.hk2.osgiadapter.HK2Main.start(HK2Main.java:125)
    at org.apache.felix.framework.util.SecureAction.startActivator(SecureAction.java:640)
    at org.apache.felix.framework.Felix.activateBundle(Felix.java:1700)
    at org.apache.felix.framework.Felix.startBundle(Felix.java:1622)
    at org.apache.felix.framework.BundleImpl.start(BundleImpl.java:915)
    at org.jvnet.hk2.osgimain.Main.start(Main.java:140)
    at org.apache.felix.framework.util.SecureAction.startActivator(SecureAction.java:640)
    at org.apache.felix.framework.Felix.activateBundle(Felix.java:1700)
    at org.apache.felix.framework.Felix.startBundle(Felix.java:1622)
    at org.apache.felix.framework.Felix.setActiveStartLevel(Felix.java:1077)
    at org.apache.felix.framework.StartLevelImpl.run(StartLevelImpl.java:264)
    at java.lang.Thread.run(Thread.java:619)
    et ça :
    ATTENTION: Exception while starting bundle com.sun.enterprise.osgi-adapter [61]
    org.osgi.framework.BundleException: Activator start error in bundle com.sun.enterprise.osgi-adapter [61].

    at org.apache.felix.framework.Felix.activateBundle(Felix.java:1751)
    at org.apache.felix.framework.Felix.startBundle(Felix.java:1622)
    at org.apache.felix.framework.BundleImpl.start(BundleImpl.java:915)
    at org.jvnet.hk2.osgimain.Main.start(Main.java:140)
    at org.apache.felix.framework.util.SecureAction.startActivator(SecureAction.java:640)
    at org.apache.felix.framework.Felix.activateBundle(Felix.java:1700)
    at org.apache.felix.framework.Felix.startBundle(Felix.java:1622)
    at org.apache.felix.framework.Felix.setActiveStartLevel(Felix.java:1077)
    at org.apache.felix.framework.StartLevelImpl.run(StartLevelImpl.java:264)
    at java.lang.Thread.run(Thread.java:619)
    Caused by: java.lang.NullPointerException
    at org.glassfish.admin.monitor.jvm.JVMStatsProviderBootstrap.postConstruct(JVMStatsProviderBootstrap.java:87)
    at com.sun.hk2.component.AbstractWombImpl.inject(AbstractWombImpl.java:174)
    at com.sun.hk2.component.ConstructorWomb$1.run(ConstructorWomb.java:87)
    at java.security.AccessController.doPrivileged(Native Method)
    at com.sun.hk2.component.ConstructorWomb.initialize(ConstructorWomb.java:84)
    at com.sun.hk2.component.AbstractWombImpl.get(AbstractWombImpl.java:77)
    at com.sun.hk2.component.SingletonInhabitant.get(SingletonInhabitant.java:58)
    at com.sun.hk2.component.LazyInhabitant.get(LazyInhabitant.java:107)
    at com.sun.hk2.component.AbstractInhabitantImpl.get(AbstractInhabitantImpl.java:60)
    at com.sun.enterprise.v3.server.AppServerStartup.run(AppServerStartup.java:313)
    at com.sun.enterprise.v3.server.AppServerStartup.start(AppServerStartup.java:128)
    at com.sun.enterprise.module.bootstrap.Main.launch(Main.java:457)
    at com.sun.enterprise.module.bootstrap.Main.launch(Main.java:401)
    at org.jvnet.hk2.osgiadapter.HK2Main.start(HK2Main.java:125)
    at org.apache.felix.framework.util.SecureAction.startActivator(SecureAction.java:640)
    at org.apache.felix.framework.Felix.activateBundle(Felix.java:1700)
    ... 9 more


    Ainsi, en faisant abstraction de ces exceptions, j'essaie quand même de me connecter par ma page login.xhtml, et logiquement ça plante :
    ATTENTION: A system exception occurred during an invocation on EJB UtilisateurFacade method public entity.Utilisateur stateless.UtilisateurFacade.authenticate(java.lang.String,java.lang.String)
    javax.ejb.EJBException

    at com.sun.ejb.containers.BaseContainer.processSystemException(BaseContainer.java:5119)
    at com.sun.ejb.containers.BaseContainer.completeNewTx(BaseContainer.java:5017)
    at com.sun.ejb.containers.BaseContainer.postInvokeTx(BaseContainer.java:4805)
    at com.sun.ejb.containers.BaseContainer.postInvoke(BaseContainer.java:2004)
    at com.sun.ejb.containers.BaseContainer.postInvoke(BaseContainer.java:1955)
    at com.sun.ejb.containers.EJBLocalObjectInvocationHandler.invoke(EJBLocalObjectInvocationHandler.java:198)
    at com.sun.ejb.containers.EJBLocalObjectInvocationHandlerDelegate.invoke(EJBLocalObjectInvocationHandlerDelegate.java:84)
    at $Proxy129.authenticate(Unknown Source)
    at controller.UtilisateurSession.doConnect(UtilisateurSession.java:116)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
    at java.lang.reflect.Method.invoke(Method.java:597)
    at com.sun.el.parser.AstValue.invoke(AstValue.java:234)
    at com.sun.el.MethodExpressionImpl.invoke(MethodExpressionImpl.java:297)
    at com.sun.faces.facelets.el.TagMethodExpression.invoke(TagMethodExpression.java:98)
    at javax.faces.component.MethodBindingMethodExpressionAdapter.invoke(MethodBindingMethodExpressionAdapter.java:88)
    at com.sun.faces.application.ActionListenerImpl.processAction(ActionListenerImpl.java:102)
    at javax.faces.component.UICommand.broadcast(UICommand.java:315)
    at javax.faces.component.UIViewRoot.broadcastEvents(UIViewRoot.java:775)
    at javax.faces.component.UIViewRoot.processApplication(UIViewRoot.java:1267)
    at com.sun.faces.lifecycle.InvokeApplicationPhase.execute(InvokeApplicationPhase.java:82)
    at com.sun.faces.lifecycle.Phase.doPhase(Phase.java:101)
    at com.sun.faces.lifecycle.LifecycleImpl.execute(LifecycleImpl.java:118)
    at javax.faces.webapp.FacesServlet.service(FacesServlet.java:312)
    at org.apache.catalina.core.StandardWrapper.service(StandardWrapper.java:1523)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:343)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:215)
    at org.primefaces.webapp.filter.FileUploadFilter.doFilter(FileUploadFilter.java:79)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:256)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:215)
    at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:277)
    at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:188)
    at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:641)
    at com.sun.enterprise.web.WebPipeline.invoke(WebPipeline.java:97)
    at com.sun.enterprise.web.PESessionLockingStandardPipeline.invoke(PESessionLockingStandardPipeline.java:85)
    at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:185)
    at org.apache.catalina.connector.CoyoteAdapter.doService(CoyoteAdapter.java:325)
    at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:226)
    at com.sun.enterprise.v3.services.impl.ContainerMapper.service(ContainerMapper.java:165)
    at com.sun.grizzly.http.ProcessorTask.invokeAdapter(ProcessorTask.java:791)
    at com.sun.grizzly.http.ProcessorTask.doProcess(ProcessorTask.java:693)
    at com.sun.grizzly.http.ProcessorTask.process(ProcessorTask.java:954)
    at com.sun.grizzly.http.DefaultProtocolFilter.execute(DefaultProtocolFilter.java:170)
    at com.sun.grizzly.DefaultProtocolChain.executeProtocolFilter(DefaultProtocolChain.java:135)
    at com.sun.grizzly.DefaultProtocolChain.execute(DefaultProtocolChain.java:102)
    at com.sun.grizzly.DefaultProtocolChain.execute(DefaultProtocolChain.java:88)
    at com.sun.grizzly.http.HttpProtocolChain.execute(HttpProtocolChain.java:76)
    at com.sun.grizzly.ProtocolChainContextTask.doCall(ProtocolChainContextTask.java:53)
    at com.sun.grizzly.SelectionKeyContextTask.call(SelectionKeyContextTask.java:57)
    at com.sun.grizzly.ContextTask.run(ContextTask.java:69)
    at com.sun.grizzly.util.AbstractThreadPool$Worker.doWork(AbstractThreadPool.java:330)
    at com.sun.grizzly.util.AbstractThreadPool$Worker.run(AbstractThreadPool.java:309)
    at java.lang.Thread.run(Thread.java:619)
    Caused by: java.lang.IllegalArgumentException: An exception occurred while creating a query in EntityManager:
    Exception Description: Error compiling the query [SELECT u FROM Utilisateur u WHERE u.identifiant = :identifiant]. Unknown entity type [Utilisateur].

    at org.eclipse.persistence.internal.jpa.EntityManagerImpl.createQuery(EntityManagerImpl.java:1328)
    at org.eclipse.persistence.internal.jpa.EntityManagerImpl.createQuery(EntityManagerImpl.java:1348)
    at stateless.UtilisateurFacade.authenticate(UtilisateurFacade.java:45)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
    at java.lang.reflect.Method.invoke(Method.java:597)
    at org.glassfish.ejb.security.application.EJBSecurityManager.runMethod(EJBSecurityManager.java:1056)
    at org.glassfish.ejb.security.application.EJBSecurityManager.invoke(EJBSecurityManager.java:1128)
    at com.sun.ejb.containers.BaseContainer.invokeBeanMethod(BaseContainer.java:5292)
    at com.sun.ejb.EjbInvocation.invokeBeanMethod(EjbInvocation.java:615)
    at com.sun.ejb.containers.interceptors.AroundInvokeChainImpl.invokeNext(InterceptorManager.java:797)
    at com.sun.ejb.EjbInvocation.proceed(EjbInvocation.java:567)
    at com.sun.ejb.containers.interceptors.SystemInterceptorProxy.doAround(SystemInterceptorProxy.java:157)
    at com.sun.ejb.containers.interceptors.SystemInterceptorProxy.aroundInvoke(SystemInterceptorProxy.java:139)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
    at java.lang.reflect.Method.invoke(Method.java:597)
    at com.sun.ejb.containers.interceptors.AroundInvokeInterceptor.intercept(InterceptorManager.java:858)
    at com.sun.ejb.containers.interceptors.AroundInvokeChainImpl.invokeNext(InterceptorManager.java:797)
    at com.sun.ejb.containers.interceptors.InterceptorManager.intercept(InterceptorManager.java:367)
    at com.sun.ejb.containers.BaseContainer.__intercept(BaseContainer.java:5264)
    at com.sun.ejb.containers.BaseContainer.intercept(BaseContainer.java:5252)
    at com.sun.ejb.containers.EJBLocalObjectInvocationHandler.invoke(EJBLocalObjectInvocationHandler.java:190)
    ... 48 more
    Caused by: Exception [EclipseLink-8034] (Eclipse Persistence Services - 2.0.1.v20100213-r6600): org.eclipse.persistence.exceptions.JPQLException
    Exception Description: Error compiling the query [SELECT u FROM Utilisateur u WHERE u.identifiant = :identifiant]. Unknown entity type [Utilisateur].

    at org.eclipse.persistence.exceptions.JPQLException.entityTypeNotFound(JPQLException.java:483)
    at org.eclipse.persistence.internal.jpa.parsing.ParseTreeContext.classForSchemaName(ParseTreeContext.java:138)
    at org.eclipse.persistence.internal.jpa.parsing.SelectNode.getClassOfFirstVariable(SelectNode.java:327)
    at org.eclipse.persistence.internal.jpa.parsing.SelectNode.getReferenceClass(SelectNode.java:316)
    at org.eclipse.persistence.internal.jpa.parsing.ParseTree.getReferenceClass(ParseTree.java:439)
    at org.eclipse.persistence.internal.jpa.parsing.ParseTree.adjustReferenceClassForQuery(ParseTree.java:79)
    at org.eclipse.persistence.internal.jpa.parsing.JPQLParseTree.populateReadQueryInternal(JPQLParseTree.java:103)
    at org.eclipse.persistence.internal.jpa.parsing.JPQLParseTree.populateQuery(JPQLParseTree.java:84)
    at org.eclipse.persistence.internal.jpa.EJBQueryImpl.buildEJBQLDatabaseQuery(EJBQueryImpl.java:202)
    at org.eclipse.persistence.internal.jpa.EJBQueryImpl.buildEJBQLDatabaseQuery(EJBQueryImpl.java:173)
    at org.eclipse.persistence.internal.jpa.EJBQueryImpl.<init>(EJBQueryImpl.java:125)
    at org.eclipse.persistence.internal.jpa.EJBQueryImpl.<init>(EJBQueryImpl.java:109)
    at org.eclipse.persistence.internal.jpa.EntityManagerImpl.createQuery(EntityManagerImpl.java:1326)
    ... 72 more

    Voilà...


    Après mon problème principal, pour l'application que j'ai développée, c'est de pouvoir gérer mes différents clients (et donc mes bases de données).

    J'aimerais déployer une fois mon application sur le serveur Glassfish avec monapp.war et, comme j'ai tenté très maladroitement de choisir la base de données lorsque le client se connecte à l'identification...



    Merci pour les conseils que l'on pourrait me donner.

  4. #4
    Membre averti
    Profil pro
    Inscrit en
    Décembre 2008
    Messages
    20
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2008
    Messages : 20
    Par défaut
    Bonjour,

    A première vue, je dirais que le problème vient d'une incompatibilité de serialVersionUID

    le serialVersionUID a une importance dans la sérialisation, vérifiez que vous avez bien générer vous-même les UID.
    Telle que le décrit la stacktrace, vous avez un objet local avec 2 UID différents, donc interprété comme 2 objets différents avec le même nom. -> Deployment fails, donc pas la peine d'essayer de se connecter, les entities ne sont pas "managées" d'où le "plantage".

    Ce serait mon 1er axe de recherche.

  5. #5
    Membre éclairé
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    70
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 70
    Par défaut
    Je trouve que c'est une très mauvaise pratique ce que vous êtes entrain d'essayer de faire.
    Mettre des données membres dans une session facade sans état (et en plus utiliser le constructeur pour cela). En plus vous cherchez à faire de la ré entrance entre la facade et le client (anti-pattern).
    J’essaye même pas de savoir d’où vient l’exception.
    Ce que je propose pour votre problème. Deux cas de figures :
    1 - Le nombre de client « types de clients » est fixe soit 2 (client 1 et client 2). C’est simple je ne ferais pas de création dynamique de PU. J’opterais pour une session facade (stateless) par type de client directement (soientt Client1Facade et Client2Facade) et le PersistenceManager sera injecté. Au niveau du client une business delegator qui en fonction de la valeur retournée par (UtilisateurSession) FacesContext.getCurrentInstance().getExternalContext().getSessionMap().get("utilisateurSession"); redirigera l’appel du client vers Client1facade ou Client2Facade.

    2- le nombre de clients « types de clients » n’est pas connu d’avance
    Dans ce cas je mettrais une seule facade statefull et un serviceLocator qui s’occupe de l’instanciation des facades. Les paramètres d’instanciation sont passés au statefull à travers une méthode init qu’appellera le service locator (On pourrait imaginer aussi utitiliser une méthode annotée @Init). C’est cette dernière méthode qui s’occupera de récupérer le EntityManager en fonction du nom du PU que lui a passé l’appelant.

  6. #6
    Membre Expert

    Homme Profil pro
    SDE
    Inscrit en
    Août 2007
    Messages
    2 013
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : SDE

    Informations forums :
    Inscription : Août 2007
    Messages : 2 013
    Par défaut
    Citation Envoyé par salber Voir le message
    1 - Le nombre de client « types de clients » est fixe soit 2 (client 1 et client 2). C’est simple je ne ferais pas de création dynamique de PU. J’opterais pour une session facade (stateless) par type de client directement (soientt Client1Facade et Client2Facade) et le PersistenceManager sera injecté. Au niveau du client une business delegator qui en fonction de la valeur retournée par (UtilisateurSession) FacesContext.getCurrentInstance().getExternalContext().getSessionMap().get("utilisateurSession"); redirigera l’appel du client vers Client1facade ou Client2Facade.
    Non.
    Un truc important : Don't repeat yourself.

    Citation Envoyé par salber Voir le message
    2- le nombre de clients « types de clients » n’est pas connu d’avance
    Dans ce cas je mettrais une seule facade statefull et un serviceLocator qui s’occupe de l’instanciation des facades. Les paramètres d’instanciation sont passés au statefull à travers une méthode init qu’appellera le service locator (On pourrait imaginer aussi utitiliser une méthode annotée @Init). C’est cette dernière méthode qui s’occupera de récupérer le EntityManager en fonction du nom du PU que lui a passé l’appelant.
    Je sais pas si je suis le seul mais je comprends rien à ce que tu propose (un coup ya une seule facade, un autre coup yen a plusieurs oO). Je suis pas vraiment d'accord avec le statefull ...

    Pour en venir au problème tu peux très bien utiliser tes URL pour loader le bon persistance-unit à base d'init-param dans ton web.xml qui associe des key à des persistance unit.

    Ensuite tu init ton EntityManager programmatiquement en fonction de la key qui est passé dans ton url

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Persistence Unit dynamique
    Par thecaptain dans le forum JPA
    Réponses: 4
    Dernier message: 09/06/2011, 10h24
  2. Gérer dynamiquement les Splitters et les Vues.
    Par elecstr dans le forum MFC
    Réponses: 3
    Dernier message: 21/05/2007, 20h37
  3. nettoyer les persistence units
    Par toomsounet dans le forum NetBeans
    Réponses: 1
    Dernier message: 11/03/2007, 14h10

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo