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 :

[JPA/Hibernate] Récupération Id


Sujet :

JPA Java

  1. #1
    Membre averti
    Inscrit en
    Juillet 2011
    Messages
    43
    Détails du profil
    Informations forums :
    Inscription : Juillet 2011
    Messages : 43
    Par défaut [JPA/Hibernate] Récupération Id
    Bonjour,

    Voilà mon problème :

    Après l'insertion d'un objet dans ma base de données SQL Server, j'aimerai récupéré l'ID généré par une stratégie jpa/hibernate.
    - (@GeneratedValue(strategy = GenerationType.IDENTITY) )
    Le problème, c'est que j'ai tout essayer, mais rien ne fonctionne, j'ai essayer d'insérer l'objet avec la fonction merge() puisqu'elle retourne l'objet créer.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    		TScheme s = null;
    		if (tScheme != null) {
    			s = em.merge(tScheme);
    		}
    		em.flush();
    		LOG.info("Id Scheme 2 = " + s.getId().toString());
    Le log me donne toujours un id égale un 0.

    Ensuite, j'ai même essayer avec la méthode persist() et une méthode de reload mais en vain ...

    Est-ce que je dois configurer autre chose ? mon fichier de persistence.xml ?


    Par avance, merci!

  2. #2
    Rédacteur/Modérateur
    Avatar de Logan Mauzaize
    Homme Profil pro
    Architecte technique
    Inscrit en
    Août 2005
    Messages
    2 894
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Architecte technique
    Secteur : Transports

    Informations forums :
    Inscription : Août 2005
    Messages : 2 894
    Par défaut
    Est-ce que ton driver supporte cette fonction ?
    Ce n'est pas le cas pour les drivers Oracle par exemple. Pour SQL Server je ne sais pas.
    Java : Cours et tutoriels - FAQ - Java SE 8 API - Programmation concurrente
    Ceylon : Installation - Concepts de base - Typage - Appels et arguments

    ECM = Exemple(reproduit le problème) Complet (code compilable) Minimal (ne postez pas votre application !)
    Une solution vous convient ? N'oubliez pas le tag
    Signature par pitipoisson

  3. #3
    Membre averti
    Inscrit en
    Juillet 2011
    Messages
    43
    Détails du profil
    Informations forums :
    Inscription : Juillet 2011
    Messages : 43
    Par défaut
    Et comment j'utilise cette fonction si j'utilise Hibernate ?

  4. #4
    Rédacteur/Modérateur
    Avatar de Logan Mauzaize
    Homme Profil pro
    Architecte technique
    Inscrit en
    Août 2005
    Messages
    2 894
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Architecte technique
    Secteur : Transports

    Informations forums :
    Inscription : Août 2005
    Messages : 2 894
    Par défaut
    Tu ne devrais pas avoir à utiliser cette fonction mais Hibernate si.
    Si Hibernate ne peux utiliser cette fonction, il n'a pas les moyens de setter l'id de ton entité.
    Java : Cours et tutoriels - FAQ - Java SE 8 API - Programmation concurrente
    Ceylon : Installation - Concepts de base - Typage - Appels et arguments

    ECM = Exemple(reproduit le problème) Complet (code compilable) Minimal (ne postez pas votre application !)
    Une solution vous convient ? N'oubliez pas le tag
    Signature par pitipoisson

  5. #5
    Membre averti
    Inscrit en
    Juillet 2011
    Messages
    43
    Détails du profil
    Informations forums :
    Inscription : Juillet 2011
    Messages : 43
    Par défaut
    Je sais pas si Hibernate peut utiliser cette fonction, comment puis-je le savoir ?

    Tu me parles aussi de "setter" mon id, mais moi je veux seulement le récupérer pour l'insérer autre part.
    En faite, mon seul but est de récupéré l'ID après l'insertion ... et de le réinsérer dans une table !!!

    Je vais essayer de m'informer si Hibernate utilise cette fonction ..

    Merci

  6. #6
    Rédacteur/Modérateur
    Avatar de Logan Mauzaize
    Homme Profil pro
    Architecte technique
    Inscrit en
    Août 2005
    Messages
    2 894
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Architecte technique
    Secteur : Transports

    Informations forums :
    Inscription : Août 2005
    Messages : 2 894
    Par défaut
    Sauf opération mystique Hibernate utilise sûrement cette fonction lorsque tu mets IDENTITY en générateur.

    La question est "Est-ce que cette méthode fonctionne avec le driver SQL Server que tu utilises ?"
    Java : Cours et tutoriels - FAQ - Java SE 8 API - Programmation concurrente
    Ceylon : Installation - Concepts de base - Typage - Appels et arguments

    ECM = Exemple(reproduit le problème) Complet (code compilable) Minimal (ne postez pas votre application !)
    Une solution vous convient ? N'oubliez pas le tag
    Signature par pitipoisson

  7. #7
    Membre averti
    Inscrit en
    Juillet 2011
    Messages
    43
    Détails du profil
    Informations forums :
    Inscription : Juillet 2011
    Messages : 43
    Par défaut
    D'après mes recherches, mon driver utilise bien cette fonction.
    (Mon driver est sqljdbc 3.0)

    J'ai testé avec une entité simple, quand j'inserts un objet, hibernate me retourne bien l'ID généré.
    Alors que quandj'essaye de récupérer un ID lorsque j'insère un objet qui contient d'autres objets (donc des clés étrangères), hibernate me le retourne pas...
    Je n'sais pas si ça peut vous mettre sur la voie...

    Merci

  8. #8
    Rédacteur/Modérateur
    Avatar de Logan Mauzaize
    Homme Profil pro
    Architecte technique
    Inscrit en
    Août 2005
    Messages
    2 894
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Architecte technique
    Secteur : Transports

    Informations forums :
    Inscription : Août 2005
    Messages : 2 894
    Par défaut
    C'est peut-être un bug Hibernate ...
    T'as regardé leur "Issue Tracker" ?

    Sinon essayes de faire une "mini-appli" qui reproduit le problème. Tu zippes les sources et tu postes sur le forum Hibernate.
    Ta "mini-appli" devrait contenir :
    • Un script SQL pour générer la base de données (créer les tables, les séquences, les contraintes, etc.
    • Les classes Java à mapper
    • Un petit Main qui instancie quelques objets Java, qui les sauvegarde et affiches les identifiants générés
    • Un fichier de configuration hibernate minimaliste
    • Les fichiers de mapping (si les classes ne sont pas déjà annotées)

    Précise bien la version d'Hibernate, la base de données (MySQL Server, si j'ai bien suivis), et le driver utilisé (si possible un lien).
    Java : Cours et tutoriels - FAQ - Java SE 8 API - Programmation concurrente
    Ceylon : Installation - Concepts de base - Typage - Appels et arguments

    ECM = Exemple(reproduit le problème) Complet (code compilable) Minimal (ne postez pas votre application !)
    Une solution vous convient ? N'oubliez pas le tag
    Signature par pitipoisson

  9. #9
    Membre très actif
    Inscrit en
    Novembre 2004
    Messages
    234
    Détails du profil
    Informations forums :
    Inscription : Novembre 2004
    Messages : 234
    Par défaut
    salut j'utilise JPA/Hibernate comment tu fias pour utiliser les librairie HIbernate?

  10. #10
    Membre averti
    Inscrit en
    Juillet 2011
    Messages
    43
    Détails du profil
    Informations forums :
    Inscription : Juillet 2011
    Messages : 43
    Par défaut
    Désolé Nemek, mais j'ai vraiment pas le temps pour créer une mini-appli, je continue acutellement mon projet, car j'ai d'autres points à éclaircir.
    En tout cas merci d'avoir pris le temps de m'aider.

    Je pense que le problème vient du fait des relations liées à mon objet ou à une config précise que j'ai oublié peut-être.
    N'aurais-tu pas un exemple concret d'application avec Hibernate qui remonte un ID lors d'une insertion?

    Merci.

  11. #11
    Rédacteur/Modérateur
    Avatar de Logan Mauzaize
    Homme Profil pro
    Architecte technique
    Inscrit en
    Août 2005
    Messages
    2 894
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Architecte technique
    Secteur : Transports

    Informations forums :
    Inscription : Août 2005
    Messages : 2 894
    Par défaut
    Le générateur "Autoassigned"
    Sinon avec les générateurs "HiLo" (table ou séqence), je n'ai jamais rencontré de problèmes.

    Essayes avec la dernière version d'Hibernate et la dernière version de ton driver.


    EDIT : A tout hasard, ta colonne est bien de type "identity(1,1)" ?
    Java : Cours et tutoriels - FAQ - Java SE 8 API - Programmation concurrente
    Ceylon : Installation - Concepts de base - Typage - Appels et arguments

    ECM = Exemple(reproduit le problème) Complet (code compilable) Minimal (ne postez pas votre application !)
    Une solution vous convient ? N'oubliez pas le tag
    Signature par pitipoisson

  12. #12
    Membre averti
    Inscrit en
    Juillet 2011
    Messages
    43
    Détails du profil
    Informations forums :
    Inscription : Juillet 2011
    Messages : 43
    Par défaut
    - "A tout hasard, ta colonne est bien de type "identity(1,1)" ? "
    C'est à dire ? :S

    A tout hasard, quelle stratégie de génération je devrais mettre si en effet l'auto-incrémentation se fait au niveau de la base de données SQLServer ?

  13. #13
    Rédacteur/Modérateur
    Avatar de Logan Mauzaize
    Homme Profil pro
    Architecte technique
    Inscrit en
    Août 2005
    Messages
    2 894
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Architecte technique
    Secteur : Transports

    Informations forums :
    Inscription : Août 2005
    Messages : 2 894
    Par défaut
    Pour que le générateur "IDENTITY" fonctionne il faut que la colonne soit déclarer a peu près comme ça : "id int IDENTITY(1,1) PRIMARY KEY".
    Sinon forcément ça ne fonctionne pas !

    Si c'est fait avec un trigger, je dirais qu'aucune strategy n'est prévue.
    Java : Cours et tutoriels - FAQ - Java SE 8 API - Programmation concurrente
    Ceylon : Installation - Concepts de base - Typage - Appels et arguments

    ECM = Exemple(reproduit le problème) Complet (code compilable) Minimal (ne postez pas votre application !)
    Une solution vous convient ? N'oubliez pas le tag
    Signature par pitipoisson

  14. #14
    Membre averti
    Inscrit en
    Juillet 2011
    Messages
    43
    Détails du profil
    Informations forums :
    Inscription : Juillet 2011
    Messages : 43
    Par défaut
    Oui la colonne est bien de type IDENTITY(1,1) ! Pas de soucis, et non l'ID n'est pas généré avec un trigger... mais par une propriété SQLServer.

    Quelle est la dernière version d'Hibernate ?

    Dans ma configuration hibernate, j'ai ajouté une autre propriété :
    - <property name="hibernate.jdbc.use_get_generated_keys" value="true"/>
    Mais rien n'y fait, ça ne fonctionne toujours pas, ni avec merge(), ni avec persist() et refresh() !!!!

    Je deviens dingue à force lol ... je continue mes recherches :s

  15. #15
    Membre averti
    Inscrit en
    Juillet 2011
    Messages
    43
    Détails du profil
    Informations forums :
    Inscription : Juillet 2011
    Messages : 43
    Par défaut
    Le problème se précise.
    Je m'explique; j'ai un trigger qui met à jour des champs dans ma table par rapport à d'autre champs ! Mais le trigger n'est vraiment pas lié à la génération d'ID, ça rien à avoir.. la génération d'ID se fait après le déploiement du trigger.
    Mais lorsque je désactive le trigger, j'arrive à recupérer l'ID... :O

    As-tu des idées ?
    Je continue mes recherches ...

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

    Informations forums :
    Inscription : Septembre 2006
    Messages : 2 964
    Par défaut
    Citation Envoyé par Kixxx Voir le message
    Oui la colonne est bien de type IDENTITY(1,1) ! Pas de soucis, et non l'ID n'est pas généré avec un trigger... mais par une propriété SQLServer.

    Quelle est la dernière version d'Hibernate ?

    Dans ma configuration hibernate, j'ai ajouté une autre propriété :
    - <property name="hibernate.jdbc.use_get_generated_keys" value="true"/>
    Mais rien n'y fait, ça ne fonctionne toujours pas, ni avec merge(), ni avec persist() et refresh() !!!!

    Je deviens dingue à force lol ... je continue mes recherches :s
    pourquoi vous attendez-vous à ce que les IDs attribués par la stratégie IDENTITY soient assignés aux entités avant que la transaction soit "commited" puisqu'il faut que le INSERT ait lieu pour le connaître ?

    tant qu'il n'y a pas de commit() de la transaction, ou de flush() de l'EntityManager il n'y a aucune chance d'avoir l'ID…

  17. #17
    Membre averti
    Inscrit en
    Juillet 2011
    Messages
    43
    Détails du profil
    Informations forums :
    Inscription : Juillet 2011
    Messages : 43
    Par défaut
    Oui vous avez raison c'est pour ça que je fais ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    if (tPerson != null) {
    em.persist(tPerson);
    }
    em.flush();
    em.refresh(tPerson);
     
    LOG.info("CREATION COURT REQUEST ID : "+tPerson.getId());
     
    return tPerson.getId();
    Je fais bien le "flush()" avant de récupérer l'ID.

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

    Informations forums :
    Inscription : Septembre 2006
    Messages : 2 964
    Par défaut
    Citation Envoyé par Kixxx Voir le message
    Oui vous avez raison c'est pour ça que je fais ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    if (tPerson != null) {
    em.persist(tPerson);
    }
    em.flush();
    em.refresh(tPerson);
     
    LOG.info("CREATION COURT REQUEST ID : "+tPerson.getId());
     
    return tPerson.getId();
    Je fais bien le "flush()" avant de récupérer l'ID.
    mais si ce code est lui-même dans une transaction…

  19. #19
    Membre averti
    Inscrit en
    Juillet 2011
    Messages
    43
    Détails du profil
    Informations forums :
    Inscription : Juillet 2011
    Messages : 43
    Par défaut
    Oui il est dans une transaction :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    	@Transactional
    	public Long create(TPerson tPerson) {
    		if (tPerson != null) {
    			em.persist(tPerson);
    		}
    		em.flush();
    		em.refresh(tPerson);
     
    		LOG.info("CREATION PERSON ID : "+tPerson.getId());
     
    		return tPerson.getId();
    	}
    Vous avez peut-être raison, vous me conseillez de faire quoi ?

    En cherchant encore sur les forums, j'ai découvert qu'Hibernate avait réellement un problème avec les triggers, et c'est vraiment à cause de celui-ci qu'il ne me remonte pas l'ID. Personne n'a déjà rencontrer ce type de problème ?

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

    Informations forums :
    Inscription : Septembre 2006
    Messages : 2 964
    Par défaut
    Citation Envoyé par Kixxx Voir le message
    Oui il est dans une transaction :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    	@Transactional
    	public Long create(TPerson tPerson) {
    		if (tPerson != null) {
    			em.persist(tPerson);
    		}
    		em.flush();
    		em.refresh(tPerson);
     
    		LOG.info("CREATION PERSON ID : "+tPerson.getId());
     
    		return tPerson.getId();
    	}
    Vous avez peut-être raison, vous me conseillez de faire quoi ?

    En cherchant encore sur les forums, j'ai découvert qu'Hibernate avait réellement un problème avec les triggers, et c'est vraiment à cause de celui-ci qu'il ne me remonte pas l'ID. Personne n'a déjà rencontrer ce type de problème ?
    ce cas est spécifique du générateur IDENTITY et n'a rien à voir directement avec les triggers même si l'on peut établir un parallèle : toute modification des entités côté serveur à l'insu de l'ORM ne peut conduire qu'à des problèmes de cohérence en l'absence d'un mécanisme de feedback (par exemple un NOTIFY du SGBD vers les clients connectés).

    aucune idée ce que vous pouvez faire si vous devez garder le générateur IDENTITY, pour de nombreuses raisons nous ne l'utilisons jamais car c'est ce qu'on appelle une "well known source of problems", nous utilisons soit notre propre "table sequence generator" (adapté pour être compatible avec la "multi-master replication" car ceux d'Hibernate ne le sont pas) ou des UUID en fonction des besoins.

Discussions similaires

  1. jpa hibernate eclipse 3.2.2
    Par lamnaourS dans le forum JPA
    Réponses: 5
    Dernier message: 15/07/2009, 18h07
  2. [Data] Spring + JPA (hibernate) + Tomcat
    Par balteo dans le forum Spring
    Réponses: 1
    Dernier message: 19/11/2007, 12h06
  3. [JPA / Hibernate] Cascade qui ne cascade pas !
    Par dazz_x dans le forum Persistance des données
    Réponses: 1
    Dernier message: 11/09/2007, 14h35
  4. JPA / Hibernate.
    Par Ho(c)ine. dans le forum Persistance des données
    Réponses: 2
    Dernier message: 23/08/2007, 16h39

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