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 :

Obtention de l'ID


Sujet :

JPA Java

  1. #1
    Membre éclairé
    Inscrit en
    Octobre 2007
    Messages
    401
    Détails du profil
    Informations forums :
    Inscription : Octobre 2007
    Messages : 401
    Par défaut Obtention de l'ID
    Bonjour

    J'ai une classe Java où je gere une table par JPA.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    ...
    em = emf.createEntityManager();
    em.getTransaction().begin();
    em.persist(myEntity);
    ...
    Avant de faire le persist, mon entity a son ID à null car il est géré par une séquence.
    Le problème c'est que je voudrais savoir quel est l'ID qui a été généré juste après que le persist soit fait. En effet après l'insertion dans la table j'ai besoin de l'ID pour faire d'autres choses avant de faire un commit.

    Comment faire pour obtenir l'ID généré?

    merci

  2. #2
    Membre confirmé
    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    40
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2007
    Messages : 40
    Par défaut
    Bonjour

    Au lieu d'utiliser persist(), essaie d'utiliser merge() qui ne renvoie pas void mais l'instance de l'objet. Avec un peu de chance l'id de l'objet qu'il retourne sera a jour

  3. #3
    Modérateur
    Avatar de OButterlin
    Homme Profil pro
    Inscrit en
    Novembre 2006
    Messages
    7 313
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 7 313
    Billets dans le blog
    1
    Par défaut
    Après l'opération persist, as-tu regardé la valeur de l'id dans ton objet ?
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  4. #4
    Membre éclairé
    Inscrit en
    Octobre 2007
    Messages
    401
    Détails du profil
    Informations forums :
    Inscription : Octobre 2007
    Messages : 401
    Par défaut
    Oui, après le persist, j'ai regardé si l'ID était dans l'objet mais il continuait à null...
    je vais regarder avec le merge pour voir ce que ça donne...

    merci

    Citation Envoyé par OButterlin Voir le message
    Après l'opération persist, as-tu regardé la valeur de l'id dans ton objet ?

  5. #5
    Modérateur
    Avatar de OButterlin
    Homme Profil pro
    Inscrit en
    Novembre 2006
    Messages
    7 313
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 7 313
    Billets dans le blog
    1
    Par défaut
    Tu utilises quel serveur et quel JPA ?

    (moi, sur JBoss avec Hibernate, après l'opération persist, l'ID est renseigné)

    A+
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  6. #6
    Membre Expert
    Homme Profil pro
    Inscrit en
    Septembre 2006
    Messages
    2 968
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Septembre 2006
    Messages : 2 968
    Par défaut
    Citation Envoyé par pjmorce Voir le message
    Oui, après le persist, j'ai regardé si l'ID était dans l'objet mais il continuait à null...
    je vais regarder avec le merge pour voir ce que ça donne...

    merci
    l'ID sera initialisé lors de l'INSERT…
    qui lui est exécuté quand l'ORM le juge nécessaire ou lors d'un flush ou au plus tard lors du COMMIT...

    persist ou merge ne provoquent pas nécessairement d'exécution directe d'instructions SQL…

  7. #7
    Membre éclairé
    Inscrit en
    Octobre 2007
    Messages
    401
    Détails du profil
    Informations forums :
    Inscription : Octobre 2007
    Messages : 401
    Par défaut
    J'utilise toplink essentials...

    Citation Envoyé par JeitEmgie Voir le message
    l'ID sera initialisé lors de l'INSERT…
    qui lui est exécuté quand l'ORM le juge nécessaire ou lors d'un flush ou au plus tard lors du COMMIT...

    persist ou merge ne provoquent pas nécessairement d'exécution directe d'instructions SQL…

  8. #8
    Membre confirmé
    Profil pro
    Inscrit en
    Septembre 2007
    Messages
    28
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2007
    Messages : 28
    Par défaut
    Salut,

    Utilise merge(),
    puis fait un flush() et regarde l'id de l'objet retourné par merge().

    C'est la solution la plus simple et la plus performante.

    Bon courage.

  9. #9
    Membre confirmé
    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    40
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2007
    Messages : 40
    Par défaut
    C'est bien ce que j'avais conseillé mais pas de nouvelles depuis ...

  10. #10
    Membre averti
    Profil pro
    Inscrit en
    Décembre 2006
    Messages
    34
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2006
    Messages : 34
    Par défaut relance
    bonjour

    je suis tombé sur ce topic en recherchant une solution à mon problème. En fait lorsque je tente de faire un merge puis un flush, mon instance ne contient toujours pas l'id qui a été auto-généré??

    J'ai essayé de faire les opérations dans les ordres suivants
    • begin, persist, merge, flush commit

    • begin, persist, commit, begin, merge, flush commit


    mais cela ne fonctionne toujours pas...

    merci de votre aide

  11. #11
    Membre averti
    Inscrit en
    Mars 2008
    Messages
    48
    Détails du profil
    Informations forums :
    Inscription : Mars 2008
    Messages : 48
    Par défaut
    Lorsque tu appel les méthodes persist(),merge() ou remove() , l'entity manager peut soit agir immédiatement sur la base de données soit différer cette action a un moment qu'il juge opportun . tu peut néanmoins forcer cette synchronisation en appelant la méthodes flush().

  12. #12
    Membre éclairé
    Inscrit en
    Mars 2008
    Messages
    254
    Détails du profil
    Informations personnelles :
    Âge : 43

    Informations forums :
    Inscription : Mars 2008
    Messages : 254
    Par défaut Solution
    salut mes amis,

    je propose de recuperer ton objet apres l'insertion on se basant sur champ version avec l'annotation @VERSION

    la requete : em.CreateQueary("select t from NomTable t where t.version =:version ").setParameter("version",1).getSingleResult;

    et donc ta l'objet en question,


    STP verifier si le champ version est initialisé à 0 ou 1.

    Bonne chance

  13. #13
    Membre éclairé
    Inscrit en
    Mars 2008
    Messages
    254
    Détails du profil
    Informations personnelles :
    Âge : 43

    Informations forums :
    Inscription : Mars 2008
    Messages : 254
    Par défaut Noooooon
    Desole, c'est la bonne solution

  14. #14
    Membre éclairé
    Inscrit en
    Mars 2008
    Messages
    254
    Détails du profil
    Informations personnelles :
    Âge : 43

    Informations forums :
    Inscription : Mars 2008
    Messages : 254
    Par défaut Reponse
    en effet pr retourner un objet on se basant sur la version n'est pas la bonne solution, parce que il est possible que autre objet crées ayant la meme version i,e on n a pas fait des changement au dessus

  15. #15
    Membre averti
    Profil pro
    Inscrit en
    Décembre 2006
    Messages
    34
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2006
    Messages : 34
    Par défaut [Résolu]toplink versus hibernate
    bon en fait après mout tentative j'en viens à la conclusion qu'il vaut mieux utiliser hibernate que toplink. En effet à la sortie d'une session toplink je n'ai pas d'id valorisé dans mon objet alors qu'avec hibernate (ou openjpa) j'ai l'id qui est bien valorisé.


    voili voilou.

    de mon point de vue ce post est résolu

  16. #16
    Membre éclairé
    Inscrit en
    Mars 2008
    Messages
    254
    Détails du profil
    Informations personnelles :
    Âge : 43

    Informations forums :
    Inscription : Mars 2008
    Messages : 254
    Par défaut Salut
    tu peux faire cette requete :

    select max(t.id) from table t

    Bonne chance

Discussions similaires

  1. [VB]obtention de valeur de pixel
    Par tuonela dans le forum VB 6 et antérieur
    Réponses: 5
    Dernier message: 24/02/2006, 09h06
  2. [PHPLIB] Obtention d'une erreur undefined index
    Par duplo dans le forum Bibliothèques et frameworks
    Réponses: 10
    Dernier message: 16/02/2006, 15h48
  3. Obtention du code d'erreur natif SQL
    Par carjo dans le forum MS SQL Server
    Réponses: 5
    Dernier message: 23/01/2006, 21h32
  4. obtention du jour d'une date
    Par micknic dans le forum Général JavaScript
    Réponses: 4
    Dernier message: 01/11/2005, 16h16
  5. Obtention de l'uid d'une Interface
    Par Trap D dans le forum Windows
    Réponses: 7
    Dernier message: 23/09/2005, 14h25

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