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

Wildfly/JBoss Java Discussion :

Comment changer d'utilisateur de la BD dans le code?


Sujet :

Wildfly/JBoss Java

  1. #1
    Candidat au Club
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    3
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2007
    Messages : 3
    Points : 2
    Points
    2
    Par défaut Comment changer d'utilisateur de la BD dans le code?
    Bonjour,

    Sur un serveur jboss 4.0.5 j'essaye de changer dynamiquement l'utilisateur de la base de donnée en fonction de l'utilisateur de l'application.
    J'essaye de faire cela dans un ejb session.
    En définissant plusieurs datasource dans persistence.xml et plusieurs entitymanager dans l'ejb, je peux changer dynamiquement l'utilisateur de la base mais je ne vais pas définir des datasources pour chaque utilisateur.
    J'ai essayé d'utiliser Persistence.createEntityManagerFactory() en passant le user et son password dans la Map en paramètre mais j'ai une erreur en rapport à la transaction strategy.

    Quelqu'un sait-il comment faire, je peux vous montrez le code et l'erreur si nécessaire.

    Cordialement,

    Anthony

  2. #2
    Membre habitué
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Août 2002
    Messages
    237
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2002
    Messages : 237
    Points : 185
    Points
    185
    Par défaut
    Je pense que tu as tout intérêt ...

  3. #3
    Candidat au Club
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    3
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2007
    Messages : 3
    Points : 2
    Points
    2
    Par défaut
    Ok voici le code de l'ejb session

    package session.bean;

    import java.sql.SQLException;
    import java.util.Collection;
    import java.util.HashMap;
    import java.util.Map;

    import javax.ejb.Local;
    import javax.ejb.Remote;
    import javax.ejb.Stateful;
    import javax.ejb.Stateless;
    import javax.naming.Context;
    import javax.naming.InitialContext;
    import javax.naming.NamingException;
    import javax.persistence.EntityManager;
    import javax.persistence.EntityManagerFactory;
    import javax.persistence.EntityTransaction;
    import javax.persistence.Persistence;
    import javax.persistence.PersistenceContext;
    import javax.persistence.PersistenceUnit;
    import javax.sql.DataSource;

    import session.ContactManager;
    import session.RemoteContactManager;
    import dto.ContactDTO;
    import entity.Contact;
    import entity.ContactAdapter;

    @Stateful
    //déclare la classe comme étant un session bean stateless
    @Local(value = { ContactManager.class })

    // interface distante
    @Remote(value = { RemoteContactManager.class })

    // déclare les interfaces locales utilisées par les clients locaux
    public class ContactManagerBean implements ContactManager,RemoteContactManager {
    //PersistenceContext(unitName="testUnit") protected EntityManager em;
    //PersistenceContext(unitName="testUnit2") protected EntityManager em2;
    /**
    * Ajoute un contact
    */
    public ContactDTO addContact(ContactDTO contactDTO) {
    Map<String, String> env = new HashMap<String, String>();
    env.put("hibernate.connection.username", "test");
    env.put("hibernate.connection.password", "test");
    EntityManagerFactory emf =Persistence.createEntityManagerFactory("testUnit",env);
    EntityManager em = emf.createEntityManager();
    Contact contact = ContactAdapter.getContact(contactDTO);
    EntityTransaction tx = em.getTransaction();
    tx.begin();
    em.persist(contact);
    tx.commit();
    em.close();
    return ContactAdapter.getContactDTO(contact);
    }

    /**
    * Liste l'ensemble des contacts de la base de données
    */
    public Collection<ContactDTO> listContact() {
    EntityManagerFactory emf =Persistence.createEntityManagerFactory("testUnit");
    EntityManager em = emf.createEntityManager();
    EntityTransaction tx = em.getTransaction();
    tx.begin();
    Collection<Contact> colC= em.createQuery("SELECT c FROM Contact c").getResultList();
    tx.commit();
    em.close();
    return ContactAdapter.getContactDTOCollection(colC);
    }
    }
    Voici la definition de la db dans persistence.xml

    <persistence-unit name="testUnit" transaction-type="JTA">
    <jta-data-source>java:TestDS</jta-data-source>
    <provider>org.hibernate.ejb.HibernatePersistence</provider>
    <class>entity.Contact</class>
    <properties>
    <property name="hibernate.hbm2ddl.auto" value="validate" />
    <property name="hibernate.dialect"
    value="org.hibernate.dialect.MySQLInnoDBDialect" />
    <property name="hibernate.connection.url" value="jdbc:mysql://localhost:3306/test" />
    <property name="hibernate.connection.username" value="sa" />
    <property name="hibernate.connection.password" value="" />
    <property name="hibernate.connection.driver_class" value="com.mysql.jdbc.Driver" />
    <property name="hibernate.connection.pool_size" value="10" />
    </properties>
    </persistence-unit>
    Et voici l'erreur

    Caused by: javax.ejb.EJBException: javax.persistence.PersistenceException: org.hibernate.HibernateException: The chosen transaction strategy requires access to the JTA TransactionManager
    at org.jboss.ejb3.tx.Ejb3TxPolicy.handleExceptionInOurTx(Ejb3TxPolicy.java:69)
    at org.jboss.aspects.tx.TxPolicy.invokeInOurTx(TxPolicy.java:83)
    at org.jboss.aspects.tx.TxInterceptor$Required.invoke(TxInterceptor.java:191)
    at org.jboss.aop.joinpoint.MethodInvocation.invokeNext(MethodInvocation.java:101)
    at org.jboss.aspects.tx.TxPropagationInterceptor.invoke(TxPropagationInterceptor.java:76)
    at org.jboss.aop.joinpoint.MethodInvocation.invokeNext(MethodInvocation.java:101)
    at org.jboss.ejb3.stateful.StatefulInstanceInterceptor.invoke(StatefulInstanceInterceptor.java:83)
    at org.jboss.aop.joinpoint.MethodInvocation.invokeNext(MethodInvocation.java:101)
    at org.jboss.aspects.security.AuthenticationInterceptor.invoke(AuthenticationInterceptor.java:77)
    at org.jboss.ejb3.security.Ejb3AuthenticationInterceptor.invoke(Ejb3AuthenticationInterceptor.java:102)
    at org.jboss.aop.joinpoint.MethodInvocation.invokeNext(MethodInvocation.java:101)
    at org.jboss.ejb3.ENCPropagationInterceptor.invoke(ENCPropagationInterceptor.java:47)
    at org.jboss.aop.joinpoint.MethodInvocation.invokeNext(MethodInvocation.java:101)
    at org.jboss.ejb3.asynchronous.AsynchronousInterceptor.invoke(AsynchronousInterceptor.java:106)
    at org.jboss.aop.joinpoint.MethodInvocation.invokeNext(MethodInvocation.java:101)
    at org.jboss.ejb3.stateful.StatefulContainer.dynamicInvoke(StatefulContainer.java:319)
    at org.jboss.ejb3.remoting.IsLocalInterceptor.invoke(IsLocalInterceptor.java:58)
    at org.jboss.aop.joinpoint.MethodInvocation.invokeNext(MethodInvocation.java:101)
    at org.jboss.ejb3.stateful.StatefulRemoteProxy.invoke(StatefulRemoteProxy.java:133)
    at $Proxy70.listContact(Unknown Source)
    at testjsf.ContactBean.listContact(ContactBean.java:117)
    at testjsf.ContactBean.<init>(ContactBean.java:31)
    at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
    at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:39)
    at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:27)
    at java.lang.reflect.Constructor.newInstance(Constructor.java:494)
    at java.lang.Class.newInstance0(Class.java:350)
    at java.lang.Class.newInstance(Class.java:303)
    at org.apache.myfaces.shared_impl.util.ClassUtils.newInstance(ClassUtils.java:277)
    at org.apache.myfaces.shared_impl.util.ClassUtils.newInstance(ClassUtils.java:268)
    at org.apache.myfaces.config.ManagedBeanBuilder.buildManagedBean(ManagedBeanBuilder.java:49)
    at org.apache.myfaces.el.VariableResolverImpl.resolveVariable(VariableResolverImpl.java:314)
    at org.apache.myfaces.el.ValueBindingImpl$ELVariableResolver.resolveVariable(ValueBindingImpl.java:570)
    at org.apache.commons.el.NamedValue.evaluate(NamedValue.java:124)
    at org.apache.commons.el.ComplexValue.evaluate(ComplexValue.java:140)
    at org.apache.myfaces.el.ValueBindingImpl.getValue(ValueBindingImpl.java:386)
    ... 47 more
    Caused by: javax.persistence.PersistenceException: org.hibernate.HibernateException: The chosen transaction strategy requires access to the JTA TransactionManager
    at org.hibernate.ejb.Ejb3Configuration.buildEntityManagerFactory(Ejb3Configuration.java:698)
    at org.hibernate.ejb.HibernatePersistence.createEntityManagerFactory(HibernatePersistence.java:121)
    at javax.persistence.Persistence.createEntityManagerFactory(Persistence.java:51)
    at javax.persistence.Persistence.createEntityManagerFactory(Persistence.java:33)
    at session.bean.ContactManagerBean.listContact(ContactManagerBean.java:73)
    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:585)
    at org.jboss.aop.joinpoint.MethodInvocation.invokeNext(MethodInvocation.java:112)
    at org.jboss.ejb3.interceptor.InvocationContextImpl.proceed(InvocationContextImpl.java:166)
    at org.jboss.ejb3.interceptor.EJB3InterceptorsInterceptor.invoke(EJB3InterceptorsInterceptor.java:63)
    at org.jboss.aop.joinpoint.MethodInvocation.invokeNext(MethodInvocation.java:101)
    at org.jboss.ejb3.entity.ExtendedPersistenceContextPropagationInterceptor.invoke(ExtendedPersistenceContextPropagationInterceptor.java:57)
    at org.jboss.aop.joinpoint.MethodInvocation.invokeNext(MethodInvocation.java:101)
    at org.jboss.ejb3.entity.TransactionScopedEntityManagerInterceptor.invoke(TransactionScopedEntityManagerInterceptor.java:54)
    at org.jboss.aop.joinpoint.MethodInvocation.invokeNext(MethodInvocation.java:101)
    at org.jboss.ejb3.AllowedOperationsInterceptor.invoke(AllowedOperationsInterceptor.java:46)
    at org.jboss.aop.joinpoint.MethodInvocation.invokeNext(MethodInvocation.java:101)
    at org.jboss.aspects.tx.TxPolicy.invokeInOurTx(TxPolicy.java:79)
    ... 81 more
    Caused by: org.hibernate.HibernateException: The chosen transaction strategy requires access to the JTA TransactionManager
    at org.hibernate.impl.SessionFactoryImpl.<init>(SessionFactoryImpl.java:329)
    at org.hibernate.cfg.Configuration.buildSessionFactory(Configuration.java:1218)
    at org.hibernate.ejb.Ejb3Configuration.buildEntityManagerFactory(Ejb3Configuration.java:691)
    ... 100 more
    Merci de m'aider si vous pouvez

  4. #4
    Candidat au Club
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    3
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2007
    Messages : 3
    Points : 2
    Points
    2
    Par défaut
    J'ai pu corriger mon problème. Je ne sais pas si c'est une bonne façon de changer de DB user dynamiquement mais cela a marché.

    Il faut rajouter la ligne suivante dans persistence.xml
    <property name="hibernate.transaction.manager_lookup_class" value="org.hibernate.transaction.JBossTransactionManagerLookup"/>
    Il ne faut gérer l'ouverture et la fermeture de la transaction explicitement dans l'ejb session
    Voici le code de l'ejb
    package session.bean;

    import java.util.Collection;
    import java.util.HashMap;
    import java.util.Map;

    import javax.ejb.Local;
    import javax.ejb.Remote;
    import javax.ejb.Stateful;
    import javax.persistence.EntityManager;
    import javax.persistence.EntityManagerFactory;
    import javax.persistence.Persistence;

    import session.ContactManager;
    import session.RemoteContactManager;
    import dto.ContactDTO;
    import entity.Contact;
    import entity.ContactAdapter;

    @Stateful
    @Local(value = { ContactManager.class })

    // interface distante
    @Remote(value = { RemoteContactManager.class })

    // déclare les interfaces locales utilisées par les clients locaux
    public class ContactManagerBean implements ContactManager,RemoteContactManager {
    /**
    * Ajoute un contact
    */
    public ContactDTO addContact(ContactDTO contactDTO) {
    Map<String, String> env = new HashMap<String, String>();
    env.put("hibernate.connection.username", "test");
    env.put("hibernate.connection.password", "test");
    EntityManagerFactory emf =Persistence.createEntityManagerFactory("testUnit",env);
    EntityManager em = emf.createEntityManager();
    Contact contact = ContactAdapter.getContact(contactDTO);
    em.persist(contact);
    return ContactAdapter.getContactDTO(contact);
    }

    /**
    * Liste l'ensemble des contacts de la base de données
    */
    public Collection<ContactDTO> listContact() {
    EntityManagerFactory emf =Persistence.createEntityManagerFactory("testUnit");
    EntityManager em = emf.createEntityManager();
    Collection<Contact> colC= em.createQuery("SELECT c FROM Contact c").getResultList();
    return ContactAdapter.getContactDTOCollection(colC);
    }
    }

  5. #5
    Membre éclairé Avatar de XmasRock
    Inscrit en
    Janvier 2007
    Messages
    729
    Détails du profil
    Informations forums :
    Inscription : Janvier 2007
    Messages : 729
    Points : 821
    Points
    821
    Par défaut
    Sur un serveur jboss 4.0.5 j'essaye de changer dynamiquement l'utilisateur de la base de donnée en fonction de l'utilisateur de l'application.
    En faisant ça tu violes toutes les bonnes pratiques. Tu lies le fonctionnel au technique. Tu fais une erreur de conception.

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

Discussions similaires

  1. Réponses: 1
    Dernier message: 23/07/2011, 13h13
  2. Comment changer l'ordre d'affichage Bibtex dans un fichier Latex
    Par kimoto dans le forum Bibliographies - Index - Glossaires
    Réponses: 3
    Dernier message: 26/01/2007, 12h07
  3. Comment changer le format d'un TIME dans EasyPHP
    Par brazilia28 dans le forum SQL Procédural
    Réponses: 6
    Dernier message: 08/12/2006, 17h31
  4. Réponses: 7
    Dernier message: 13/11/2006, 12h12
  5. Comment Changer l'utilisateur en cours sur access 2003
    Par schwinny dans le forum Access
    Réponses: 2
    Dernier message: 26/06/2006, 13h44

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