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

Java EE Discussion :

récuperer la clé primaire génerée automatiquement [EJB3 Entity]


Sujet :

Java EE

  1. #1
    Candidat au Club
    Inscrit en
    Mars 2007
    Messages
    1
    Détails du profil
    Informations forums :
    Inscription : Mars 2007
    Messages : 1
    Points : 2
    Points
    2
    Par défaut récuperer la clé primaire génerée automatiquement
    Bonjour à tous.
    j'ai crée une Entity avec un ID qui est généré automatiquement avec l'annotation @GeneratedValue(strategy = GenerationType.AUTO)
    ma question est : commment récupérer l'ID juste aprés la création de l'enregistrement (j'ai besoin d'imprimer l'enregistrement au moment même de sa création, et je voulais savoir s'il y a une methode autre que de faire une requête qui contient les informations qui identifient l'enregistrement de façon unique).
    Je vous remercie d'avance pour votre aide.

  2. #2
    Membre confirmé Avatar de Claythest
    Profil pro
    Inscrit en
    Mai 2003
    Messages
    558
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2003
    Messages : 558
    Points : 554
    Points
    554
    Par défaut
    Citation Envoyé par berioua
    commment récupérer l'ID juste aprés la création de l'enregistrement
    Un appel à la méthode getId() ne suffit pas ?

  3. #3
    Membre actif Avatar de CaptainCyd
    Inscrit en
    Avril 2007
    Messages
    201
    Détails du profil
    Informations personnelles :
    Âge : 45

    Informations forums :
    Inscription : Avril 2007
    Messages : 201
    Points : 232
    Points
    232
    Par défaut 1 solution pour récupérer l'id généré automatiquement
    D'après ce que j'ai vu, lorsque tu mets la génération de l'id en auto, il se crée au moment où tu fais le persist.

    Ce qui me parait logique vu que c'est le SGBD derrière qui génére la valeur au moment où il fait l'instruction INSERT

    Le truc est de modifier ta fonction dans ton SessionBean qui fait le persist par le code suivant :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    public MyEntity addMyEntity(MyEntity myEntity) {
       em.persist(myEntity);
       return myEntity;
    }
    Comme cela, après tu peux invoquer la méthode getId pour récupérer ton id.

    Si tu cherches aussi à mettre à jour un enregistrement de ton entity, il faut utiliser la méthode merge de la classe EntityManager (j'ai chercher un moment avant de la trouver celle-là )
    Il y a de jeunes pilotes audacieux, il y a de vieux pilotes, mais il n'y a pas de vieux pilotes audacieux


  4. #4
    Membre habitué
    Profil pro
    Analyste programmeur
    Inscrit en
    Novembre 2006
    Messages
    197
    Détails du profil
    Informations personnelles :
    Localisation : Tunisie

    Informations professionnelles :
    Activité : Analyste programmeur

    Informations forums :
    Inscription : Novembre 2006
    Messages : 197
    Points : 167
    Points
    167
    Par défaut
    bonjour,

    j'ai la essayer mais elle ne pas marché voici l'erreur:

    ERROR [STDERR] javax.ejb.EJBException: java.lang.IllegalArgumentException: Wrong target. class model.SessionEJBBean for public model.RecTPjointe model.SessionEJBBean.persistRecTPjointe(model.RecTPjointe)
    2007-06-21 10:12:45,531 ERROR [STDERR] at org.jboss.ejb3.tx.Ejb3TxPolicy.handleExceptionInOurTx(Ejb3TxPolicy.java:69)
    2007-06-21 10:12:45,531 ERROR [STDERR] at org.jboss.aspects.tx.TxPolicy.invokeInOurTx(TxPolicy.java:83)
    2007-06-21 10:12:45,531 ERROR [STDERR] at org.jboss.aspects.tx.TxInterceptor$Required.invoke(TxInterceptor.java:191)
    2007-06-21 10:12:45,531 ERROR [STDERR] at org.jboss.aop.joinpoint.MethodInvocation.invokeNext(MethodInvocation.java:101)
    2007-06-21 10:12:45,531 ERROR [STDERR] at org.jboss.aspects.tx.TxPropagationInterceptor.invoke(TxPropagationInterceptor.java:76)
    2007-06-21 10:12:45,531 ERROR [STDERR] at org.jboss.aop.joinpoint.MethodInvocation.invokeNext(MethodInvocation.java:101)
    2007-06-21 10:12:45,531 ERROR [STDERR] at org.jboss.ejb3.stateless.StatelessInstanceInterceptor.invoke(StatelessInstanceInterceptor.java:62)
    2007-06-21 10:12:45,531 ERROR [STDERR] at org.jboss.aop.joinpoint.MethodInvocation.invokeNext(MethodInvocation.java:101)
    2007-06-21 10:12:45,531 ERROR [STDERR] at org.jboss.aspects.security.AuthenticationInterceptor.invoke(AuthenticationInterceptor.java:77)
    2007-06-21 10:12:45,531 ERROR [STDERR] at org.jboss.ejb3.security.Ejb3AuthenticationInterceptor.invoke(Ejb3AuthenticationInterceptor.java:102)
    2007-06-21 10:12:45,531 ERROR [STDERR] at org.jboss.aop.joinpoint.MethodInvocation.invokeNext(MethodInvocation.java:101)
    2007-06-21 10:12:45,531 ERROR [STDERR] at org.jboss.ejb3.ENCPropagationInterceptor.invoke(ENCPropagationInterceptor.java:47)
    2007-06-21 10:12:45,531 ERROR [STDERR] at org.jboss.aop.joinpoint.MethodInvocation.invokeNext(MethodInvocation.java:101)
    2007-06-21 10:12:45,531 ERROR [STDERR] at org.jboss.ejb3.asynchronous.AsynchronousInterceptor.invoke(AsynchronousInterceptor.java:106)
    2007-06-21 10:12:45,531 ERROR [STDERR] at org.jboss.aop.joinpoint.MethodInvocation.invokeNext(MethodInvocation.java:101)
    2007-06-21 10:12:45,531 ERROR [STDERR] at org.jboss.ejb3.stateless.StatelessContainer.dynamicInvoke(StatelessContainer.java:263)
    2007-06-21 10:12:45,531 ERROR [STDERR] at org.jboss.aop.Dispatcher.invoke(Dispatcher.java:106)
    2007-06-21 10:12:45,531 ERROR [STDERR] at org.jboss.aspects.remoting.AOPRemotingInvocationHandler.invoke(AOPRemotingInvocationHandler.java:82)
    2007-06-21 10:12:45,531 ERROR [STDERR] at org.jboss.remoting.ServerInvoker.invoke(ServerInvoker.java:828)
    2007-06-21 10:12:45,531 ERROR [STDERR] at org.jboss.remoting.ServerInvoker.invoke(ServerInvoker.java:681)
    2007-06-21 10:12:45,531 ERROR [STDERR] at org.jboss.remoting.transport.socket.ServerThread.processInvocation(ServerThread.java:358)
    2007-06-21 10:12:45,531 ERROR [STDERR] at org.jboss.remoting.transport.socket.ServerThread.dorun(ServerThread.java:412)
    2007-06-21 10:12:45,531 ERROR [STDERR] at org.jboss.remoting.transport.socket.ServerThread.run(ServerThread.java:239)


    mon code est :
    dans sessionEJB:
    ..........
    public RecTPjointe persistRecTPjointe(RecTPjointe entity) {
    em.persist(entity);
    return entity;
    }
    ..........

    dans mon class :

    System.out.println("eeee id est 03 "+sessionEJB.persistRecTPjointe(pjointe).getId());

    pour afficher le id,

    j'ai essayé plusieurs essais mais ça ne pas marché.

  5. #5
    Membre actif Avatar de CaptainCyd
    Inscrit en
    Avril 2007
    Messages
    201
    Détails du profil
    Informations personnelles :
    Âge : 45

    Informations forums :
    Inscription : Avril 2007
    Messages : 201
    Points : 232
    Points
    232
    Par défaut
    Bonjour mbouzouita,

    chez moi, cela fonctionne.
    Mais j'ai rajouté une ligne par rapport à ce que j'avais trouvé à l'époque.

    Essaie avec le code suivant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    public RecTPjointe persistRecTPjointe(RecTPjointe entity) {
       em.persist(entity);
       em.flush(); // -> pour obliger le système a vider ses caches et à executer  l'INSERT de suite avec rafraichissement de l'objet
       return entity;
    }
    Il y a de jeunes pilotes audacieux, il y a de vieux pilotes, mais il n'y a pas de vieux pilotes audacieux


  6. #6
    Membre habitué
    Profil pro
    Analyste programmeur
    Inscrit en
    Novembre 2006
    Messages
    197
    Détails du profil
    Informations personnelles :
    Localisation : Tunisie

    Informations professionnelles :
    Activité : Analyste programmeur

    Informations forums :
    Inscription : Novembre 2006
    Messages : 197
    Points : 167
    Points
    167
    Par défaut
    non , c'est le meme probleme ???

  7. #7
    Membre actif Avatar de CaptainCyd
    Inscrit en
    Avril 2007
    Messages
    201
    Détails du profil
    Informations personnelles :
    Âge : 45

    Informations forums :
    Inscription : Avril 2007
    Messages : 201
    Points : 232
    Points
    232
    Par défaut
    bizarre
    Peut être que cela vient d'un des paramètres lié aux ejb.
    Je poste le code complet qui fonctionne chez moi (entity, interface et session) pour voir si tu as les mêmes déclarations

    voici le code ma classe entity :
    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
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
     
    package drdict.ejb.entity;
     
    import java.io.Serializable;
     
    import javax.persistence.Entity;
    import javax.persistence.GeneratedValue;
    import javax.persistence.GenerationType;
    import javax.persistence.Id;
    import javax.persistence.Table;
     
    @Entity
    @Table(name = "DRDICT_CONTACT")
    public class ContactEntity implements Serializable {
     
    	/**
             * 
             */
    	private static final long serialVersionUID = -966436313835837695L;
    	@Id
    	@GeneratedValue(strategy = GenerationType.AUTO)
    	private int contactId;
    	private String contactNom;
    	private String contactPrenom;
    	private String contactTel;
    	private String contactFax;
    	private String contactEmail;
    	private String contactFonction;
    	private String contactNomPrenom;
     
    	public String getContactEmail() {
    		return contactEmail;
    	}
    	public void setContactEmail(String contactEmail) {
    		this.contactEmail = contactEmail;
    	}
    	public String getContactFax() {
    		return contactFax;
    	}
    	public void setContactFax(String contactFax) {
    		this.contactFax = contactFax;
    	}
    	public String getContactFonction() {
    		return contactFonction;
    	}
    	public void setContactFonction(String contactFonction) {
    		this.contactFonction = contactFonction;
    	}
    	public int getContactId() {
    		return contactId;
    	}
    	public void setContactId(int contactId) {
    		this.contactId = contactId;
    	}
    	public String getContactNom() {
    		return contactNom;
    	}
    	public void setContactNom(String contactNom) {
    		this.contactNom = contactNom;
    	}
    	public String getContactPrenom() {
    		return contactPrenom;
    	}
    	public void setContactPrenom(String contactPrenom) {
    		this.contactPrenom = contactPrenom;
    	}
    	public String getContactTel() {
    		return contactTel;
    	}
    	public void setContactTel(String contactTel) {
    		this.contactTel = contactTel;
    	}
    	public String getContactNomPrenom() {
    		return contactNomPrenom;
    	}
    	public void setContactNomPrenom(String contactNomPrenom) {
    		this.contactNomPrenom = contactNomPrenom;
    	}
    }
    ma classe interface :
    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
     
    package drdict.ejb.interfaces;
     
    import java.util.List;
    import javax.ejb.Remote;
    import drdict.ejb.entity.*;
     
    @Remote
    public interface ContactInterface {
     
    	public ContactEntity ajouter(ContactEntity cE);
    	public ContactEntity modifier(ContactEntity cE);
    	public void detruire(ContactEntity cE);
    	public void detruireParId(int id);
    	public List<ContactEntity> listContact();
    	public ContactEntity rechercher(int id);
    	public List<ContactEntity> rechercherParNom(String sNom);
    	public List<ContactEntity> rechercherParNomPrenomTel(String sNom, String sPrenom, String sTel);
    }
    ma classe session :
    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
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
     
    package drdict.ejb.session;
     
    import java.util.List;
    import javax.ejb.Stateless;
    import javax.persistence.EntityManager;
    import javax.persistence.PersistenceContext;
    import drdict.ejb.entity.*;
    import drdict.ejb.interfaces.*;
     
    @Stateless
    public class ContactSession implements ContactInterface {
     
    	@PersistenceContext(unitName = "DRDICT-EJB")
    	EntityManager em;
     
    	public ContactSession() {
    		super();
    	}
     
    	public ContactEntity ajouter(ContactEntity cE) {
    	     em.persist(cE);
    	     em.flush();
    	     return cE;
    	}
     
    	public ContactEntity modifier(ContactEntity cE) {
    	     em.merge(cE);
    	     em.flush();
    	     return cE;
    	}
     
    	public void detruire(ContactEntity cE) {
    	     em.remove(cE);
    	     em.flush();
    	}
     
    	public void detruireParId(int id) {
    		ContactEntity dTe = this.rechercher(id);
    		this.detruire(dTe);
    	}
     
    	public List<ContactEntity> listContact() {
    		return em.createQuery("SELECT c FROM ContactEntity c ORDER BY c.contactNom").getResultList();
    	}
     
    	public ContactEntity rechercher(int id) {
    	      return em.find(ContactEntity.class, id);
    	}
     
    	public List<ContactEntity> rechercherParNom(String sNom) {
    		return em.createQuery("SELECT c FROM ContactEntity c WHERE c.contactNom = '"+ sNom + "' ORDER BY c.contactNom").getResultList();
     
    	}
     
    	public List<ContactEntity> rechercherParNomPrenomTel(String sNom, String sPrenom, String sTel) {
    		return em.createQuery("SELECT c FROM ContactEntity c WHERE c.contactNom = '"+ sNom + "' AND c.contactPrenom = '" + sPrenom + "' AND c.contactTel = '" + sTel + "' ORDER BY c.contactNom").getResultList();   
    	}
    }
    J'espère que cela pourra t'aider à résoudre ton pb.
    Poste ton bout de code complet pour que j'y jette un oeil, on ne sait jamais
    Il y a de jeunes pilotes audacieux, il y a de vieux pilotes, mais il n'y a pas de vieux pilotes audacieux


  8. #8
    Membre habitué
    Profil pro
    Analyste programmeur
    Inscrit en
    Novembre 2006
    Messages
    197
    Détails du profil
    Informations personnelles :
    Localisation : Tunisie

    Informations professionnelles :
    Activité : Analyste programmeur

    Informations forums :
    Inscription : Novembre 2006
    Messages : 197
    Points : 167
    Points
    167
    Par défaut
    merci,

    le probleme c'est lorsque je fais :

    sessionEJB.persistEntity(pjointe);
    int id = sessionEJB.persistRectPjointe(pjointe).getId();// retourne l'id de l'objet pjointe.

    ça marche,

    mais j'ai un probleme c'est l'objet est inseré 2 fois.

    et si je fais
    int id = sessionEJB.persistRectPjointe(pjointe).getId();// retourne l'id de l'objet pjointe.

    comme ça ne marche pas, c'est le meme message que celui du precedent

    Bizarr!!!!!!

  9. #9
    Membre actif Avatar de CaptainCyd
    Inscrit en
    Avril 2007
    Messages
    201
    Détails du profil
    Informations personnelles :
    Âge : 45

    Informations forums :
    Inscription : Avril 2007
    Messages : 201
    Points : 232
    Points
    232
    Par défaut
    J'ai un peu de mal à te suivre

    Est-ce que tu peux m'expliquer ton contexte de fonctionnement (qu'est-ce tu réalise comme fonctionnalité, dans quel but, etc.) afin que j'ai la même vision que toi

    D'après un de tes posts, tu as dit ceci :
    mon code est :
    dans sessionEJB:
    ..........
    public RecTPjointe persistRecTPjointe(RecTPjointe entity) {
    em.persist(entity);
    return entity;
    }
    ..........

    dans mon class :

    System.out.println("eeee id est 03 "+sessionEJB.persistRecTPjointe(pjointe).getId());

    pour afficher le id,
    sessionEJB contient une instance de ta classe Session associé à ton Entity ?

    Est-ce que la variable id de ton Entity est bien déclaré avec l'annotation suivante :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    qui permet de spécifier que ta variable qui represente ton id est bien en génération automatique ?

    Après ces vérifications, il y a qq chose dans ton code qui m'étonne.
    J'ai l'impression que tu confond l'objet Session et l'objet Entity.
    L'objet Session permet de récupérer des objets Entity.
    Donc, dans ton cas, ton objet Session permet de créer un nouvel enregistrement en base, donc créer de nouveaux objets entity et te les renvoie.
    L'enregistrement en base est représenté par ton objet Entity, donc c'est lui qui te renvoie l'id, et non ton objet Session.
    Hors ce que tu fais là :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    sessionEJB.persistRectPjointe(pjointe).getId();
    tu demande à l'objet Session de revoyer l'id.

    Essaie avec le code ci-dessous :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    pjointe = sessionEJB.persistEntity(pjointe); // -> crée l'objet en base et renvoie l'objet MAJ
    int id = pjointe.getId() // -> renvoie l'id porté porté par ton objet MAJ précédement
    pjointe est un objet de ta classe entity Pjointe
    sessionEJB est un objet de ta classe Session

    ta fonction persistEntity(pjointe) est comme suit :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    public RecTPjointe persistRecTPjointe(RecTPjointe entity) {
       em.persist(entity);
       em.flush(); // -> pour obliger le système a vider ses caches et à executer  l'INSERT de suite avec rafraichissement de l'objet
       return entity;
    }
    Il y a de jeunes pilotes audacieux, il y a de vieux pilotes, mais il n'y a pas de vieux pilotes audacieux


  10. #10
    Membre habitué
    Profil pro
    Analyste programmeur
    Inscrit en
    Novembre 2006
    Messages
    197
    Détails du profil
    Informations personnelles :
    Localisation : Tunisie

    Informations professionnelles :
    Activité : Analyste programmeur

    Informations forums :
    Inscription : Novembre 2006
    Messages : 197
    Points : 167
    Points
    167
    Par défaut
    merci pour ton aide,

    j'ai trouve ou est le probleme par hazzar, c'est qu'il faut tout d'abord supprimer les fichiers temporaire dans jboss et ensuite on redemarre le serveur est comme ça , ça marche.

    pourquoi je ne sais pas, j'ai l'essayé est ça marché.


    merci bien

    a+

  11. #11
    Membre actif Avatar de CaptainCyd
    Inscrit en
    Avril 2007
    Messages
    201
    Détails du profil
    Informations personnelles :
    Âge : 45

    Informations forums :
    Inscription : Avril 2007
    Messages : 201
    Points : 232
    Points
    232
    Par défaut
    tip top

    J'aime bien quand les solutions sont trouvées

    @+
    Il y a de jeunes pilotes audacieux, il y a de vieux pilotes, mais il n'y a pas de vieux pilotes audacieux


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

Discussions similaires

  1. Réponses: 8
    Dernier message: 27/11/2007, 20h36
  2. Réponses: 10
    Dernier message: 17/03/2007, 14h05
  3. Récuperer la clé primaire après un insert
    Par JohnWinshark dans le forum Access
    Réponses: 2
    Dernier message: 22/08/2006, 13h47
  4. Generer et incrementer automatiquement le clé primaire d'un
    Par ravelo dans le forum Bases de données
    Réponses: 3
    Dernier message: 15/06/2004, 20h12

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