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 :

Aide EJB JPA Enregistrer en base de données


Sujet :

JPA Java

  1. #1
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Avril 2009
    Messages
    52
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2009
    Messages : 52
    Points : 34
    Points
    34
    Par défaut Aide EJB JPA Enregistrer en base de données
    Bonjour,

    Je tente d'insérer un utilisateur (login/mdp) dans une table utilisateur de ma base de données.

    Pour cela j'ai les classes suivantes :
    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
    @Entity
    @Table(name="utilisateur")
    public class Utilisateur implements Serializable {
     
        @Column(name = "login")
        @Id
        private String login;
     
        @Column(name = "mdp")
        private String mdp;
     
        public Utilisateur() {
        }
     
         public Utilisateur(String login, String mdp) {
            this.login = login;
            this.mdp = mdp;
        }
     
        public String getLogin()
        {
            return login;
        }
     
        public String getMdp()
        {
            return mdp;
        }
     
        public void setLogin(String login) {
            this.login = login;
        }
     
        public void setMdp(String mdp) {
            this.mdp = mdp;
        }
    }
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    @Remote
    public interface UtilisateurInterface{
     
        public void addUtil(Utilisateur util);
     
    }
    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
    @Remote(UtilisateurInterface.class)
    @Stateless
    public class UtilisateurManager implements UtilisateurInterface {
     
     EntityManagerFactory emf = Persistence.createEntityManagerFactory("EJBTP-ejbPU");
     
        @PersistenceContext
        private EntityManager em = emf.createEntityManager();
     
        public UtilisateurManager() 
        {
        }
     
        public void addUtil(Utilisateur util)
        {
            em.persist(util);
        }
    }
    Le persistence.xml :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    <?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="EJBTP-ejbPU" transaction-type="JTA">
        <jta-data-source>jdbc/M2TPCP</jta-data-source>
        <exclude-unlisted-classes>false</exclude-unlisted-classes>
        <properties>
        </properties>
      </persistence-unit>
    </persistence>
    J'ai vérifié le Pool Connection et le JDBC sur GlassFish et le ping marche.

    Tout fait mine de fonctionner mais je n'ai pas mon nouvel utilisateur dans ma base de données.

    Avez-vous une idée sur ce problème?

    Merci d'avance.

  2. #2
    Membre expérimenté
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2004
    Messages
    1 184
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Avril 2004
    Messages : 1 184
    Points : 1 745
    Points
    1 745
    Par défaut
    As-tu essayé de faire un flush après le persist ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    em.persist(user);
    em.flush();

  3. #3
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Avril 2009
    Messages
    52
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2009
    Messages : 52
    Points : 34
    Points
    34
    Par défaut
    J'ai essayé mais j'obtiens ceci :

    javax.persistence.TransactionRequiredException:
    Exception Description: No externally managed transaction is currently active for this thread

    J'ai le Persistence Provider EclipseLink JPA 2.0.

  4. #4
    Membre expérimenté
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2004
    Messages
    1 184
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Avril 2004
    Messages : 1 184
    Points : 1 745
    Points
    1 745
    Par défaut
    Essaye d'ajouter ça sur tes EJB ou sur les méthodes d'EJB.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    @TransactionAttribute(TransactionAttributeType.REQUIRED)

  5. #5
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Avril 2009
    Messages
    52
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2009
    Messages : 52
    Points : 34
    Points
    34
    Par défaut
    J'ai tenté de le mettre ici :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    @Remote(UtilisateurInterface.class)
    @Stateless
    @TransactionAttribute(TransactionAttributeType.REQUIRED)
    public class UtilisateurManager implements UtilisateurInterface {
    Et là :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    @TransactionAttribute(TransactionAttributeType.REQUIRED)
        public void addUtil(Utilisateur util)
        {
            em.persist(util);
            em.flush();
        }
    Mais ça donne toujours la même erreur.

    Où est-ce que je dois mettre cette annotation ?

  6. #6
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Avril 2009
    Messages
    52
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2009
    Messages : 52
    Points : 34
    Points
    34
    Par défaut
    J'ai enfin réussi à trouver une version qui fonctionne :

    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
     
    @Remote(UtilisateurInterface.class)
    @Stateless
    public class UtilisateurManager implements UtilisateurInterface {
     
        private Utilisateur util;
     
        @PersistenceContext(unitName="EJBTP-ejbPU")
        private EntityManager em;
     
        public UtilisateurManager() 
        {
        }
     
        public void addUtil(Utilisateur util)
        {
            em.persist(util);
        }
     
     
    }
    Dans la Servlet :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    UtilisateurInterface ui = new UtilisateurManager();
    String login = request.getParameter("login");
            String mdp = request.getParameter("mdp");
     
            try{
            Context context = new InitialContext();
            ui = (UtilisateurInterface) context.lookup("java:module/UtilisateurManager");
            }
            catch(NamingException e){System.err.println("naming!!!");}
     
            Utilisateur u = new Utilisateur(login, mdp);
     
            ui.addUtil(u);

  7. #7
    Membre éprouvé
    Avatar de hasalex
    Homme Profil pro
    Développeur Java
    Inscrit en
    Janvier 2009
    Messages
    879
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur Java

    Informations forums :
    Inscription : Janvier 2009
    Messages : 879
    Points : 1 269
    Points
    1 269
    Par défaut
    Je me permets d'ajouter une petite explication.

    Quand tu fais emf.createEntityManager(), tu crées un EntityManager indépendant de ton environnement JavaEE alors qu'avec @PersistenceContext, tu obtiens un EntityManager intégré à JavaEE.
    C'est important car cela permet à ton EJB de valider une transaction qui utilise le bon EntityManager. Dans ta première version, le commit ne validait pas ton update !

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

Discussions similaires

  1. [MySQL] Enregistrement en base de données
    Par salirose dans le forum PHP & Base de données
    Réponses: 5
    Dernier message: 09/09/2006, 00h42
  2. Insérer Enregistrement dans Base de données
    Par TurricanII dans le forum JBuilder
    Réponses: 3
    Dernier message: 30/05/2006, 12h59
  3. Réponses: 1
    Dernier message: 17/05/2006, 15h27
  4. nbre enregistrements dans base de données
    Par Chonchon dans le forum JDBC
    Réponses: 3
    Dernier message: 09/01/2006, 20h54

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