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

Autres Java Discussion :

Récupérer le numéro de la sequence de l'entité qu'on vient de persister


Sujet :

Autres Java

  1. #1
    Membre régulier
    Homme Profil pro
    Étudiant
    Inscrit en
    Octobre 2009
    Messages
    153
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2009
    Messages : 153
    Points : 105
    Points
    105
    Par défaut Récupérer le numéro de la sequence de l'entité qu'on vient de persister
    Bonjour.
    Je gère ma persistence avec JPA. Mon problème est de pouvoir récupérer l'ID de la ligne que je viens de persister pour l'utiliser ailleurs. Seulement, la méthode persist de l'EM ne retourne rien. est-il possible de le faire?

  2. #2
    Expert éminent sénior
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 481
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Belgique

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

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 481
    Points : 48 806
    Points
    48 806
    Par défaut
    Si un autre objet géré par l'entity manager doit référencer l'id du premier, alors tu as un problème de design, il devrait référencer l'objet et non pas son id

    Pour le reste, si tu fais un flush de ton entitymanager, un id devrait être attribué à l'objet et tu peux donc faire un getId() dessus pour le connaître.

  3. #3
    Membre régulier
    Homme Profil pro
    Étudiant
    Inscrit en
    Octobre 2009
    Messages
    153
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2009
    Messages : 153
    Points : 105
    Points
    105
    Par défaut
    non! le second objet ne doit pas être généré par l'EM.
    le flush me génère une erreur
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    public T save1(T en) {
            getEntityManager().persist(en);
            getEntityManager().refresh(en);
            return en;
        }
    en fait l'id de l'objet en est null et j'imagine que lorsque je un refresh(en), l'EM ne sais pas avec quelle ligne de la BD synchroniser, donc me renvoie une erreur.
    j'ai cependant utiliser ce code:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    public T save1(T en) {
            getEntityManager().persist(en);        
              en = (T) getEntityManager().merge(en);
              getEntityManager().refresh(en, LockModeType.NONE);
            return en;
        }
    un merge pour réattacher en à l'EM, mais l'id généré ne correspond pas à celui qui est présent dans la bd. il y a pas une façon de récupérer l'id avec un currval comme on le fait en plpgsql?

  4. #4
    Expert éminent sénior
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 481
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Belgique

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

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 481
    Points : 48 806
    Points
    48 806
    Par défaut
    Quelle erreur il te génère? Je ne vois pas de flush dans ton code flush et refresh, ce n'est pas la même chose.

  5. #5
    Membre régulier
    Homme Profil pro
    Étudiant
    Inscrit en
    Octobre 2009
    Messages
    153
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2009
    Messages : 153
    Points : 105
    Points
    105
    Par défaut
    Oui tu as raison merci, c'est une erreur en fait dans le code c'est bien un flush pour synchroniser l'entity avec sa version persisté. Mais .
    l'id généré n'a rien à voir avec l'id de l'instance que je viens de persister. et très franchement j'ignore à quoi correspond cet id.

    j'ai fait l'insertion dans une autre table en utilisant la même méthode et là je réalise qu'en fait l'EM génère pour cet autre entity un id qui suit directement le précédent. En d'autres terme, il se conduit comme si toutes les entités étaient insérer dans la même table

  6. #6
    Expert éminent sénior
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 481
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Belgique

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

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 481
    Points : 48 806
    Points
    48 806
    Par défaut
    l'entity manager génère les id suivant les règles que tu lui a imposé, via sa configuration. Du coup, j'en viens à me demander ce que tu appelle l'id généré et ce que tu appelle l'id de l'instance, vu qu'il ne devrait y avoir qu'un seul id

  7. #7
    Membre régulier
    Homme Profil pro
    Étudiant
    Inscrit en
    Octobre 2009
    Messages
    153
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2009
    Messages : 153
    Points : 105
    Points
    105
    Par défaut
    Je vais tout t'expliquer par un exemple:
    là c'est le code de l'entité à persister
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    @Entity
    public class Entite implements Serializable{
     
        @Id
        @GeneratedValue(strategy = GenerationType.IDENTITY)
        @Column(name = "id", columnDefinition = "BIGSERIAL")
        private Long id;
       ......
        les autres attributs
    }
    la méthode de persistance est

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    public T save1(T en) {
            getEntityManager().persist(en);
            getEntityManager().flush();
            return en;
        }
    lorsque je fait
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    System.out.println(en.getId())
    j'obtiens par exemple 100.
    je regarde dans la base de donnée et la séquence auto-généré est 12.

    comment explique-t-on ça? et surtout comment avoir 12 juste après l'insertion? Merci encore

  8. #8
    Expert éminent sénior
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 481
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Belgique

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

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 481
    Points : 48 806
    Points
    48 806
    Par défaut
    d'un coté, tu parle de identity, et de l'autre de sequence. Tu es sûr que tu n'aurais pas un code supplémentaire, dans ta base de données, genre un trigger, qui changerais l'id après l'insertion? Ca expliquerait pourquoi la base de données n'a pas la même valeur que l'entity manager.

  9. #9
    Membre régulier
    Homme Profil pro
    Étudiant
    Inscrit en
    Octobre 2009
    Messages
    153
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2009
    Messages : 153
    Points : 105
    Points
    105
    Par défaut
    Merci tchize_ le problème vient justement du fait que j'ai négligé la pertinence des valeur Identity et Sequence. le flush fonctionne bien maintenant.
    Merci encore c'était si proche

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

    Informations forums :
    Inscription : Novembre 2006
    Messages : 7 310
    Points : 9 522
    Points
    9 522
    Billets dans le blog
    1
    Par défaut
    Ceci dit, je suis d'avis que tu as utilisé la mauvaise méthode, comme le disait tchize_, il faudrait référencer l'objet parent.
    Peut-être même persister en utilisant l'attribut cascade sur le père... mais ça dépend des cas d'usages là...
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  11. #11
    Expert éminent sénior
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 481
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Belgique

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

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 481
    Points : 48 806
    Points
    48 806
    Par défaut
    Comme il l'a dit, l'autre objet n'est pas géré par l'EM, donc probablement même pas stocké dans une DB. Log, url dans un email, .... il peut y avoir des tas de raisons de récupérer l'id

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

    Informations forums :
    Inscription : Novembre 2006
    Messages : 7 310
    Points : 9 522
    Points
    9 522
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par tchize_ Voir le message
    Comme il l'a dit, l'autre objet n'est pas géré par l'EM
    Effectivement, j'avais zappé le détail
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

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

Discussions similaires

  1. Récupérer le numéro de téléphone entrant
    Par louisss dans le forum Access
    Réponses: 23
    Dernier message: 26/07/2023, 18h21
  2. [C#] Comment récupérer le numéro de semaine d'une date ?
    Par farfadet dans le forum Windows Forms
    Réponses: 9
    Dernier message: 17/07/2013, 16h33
  3. [PDF - FOP - XSL] Récupérer le numéro d'une page
    Par caro. dans le forum XSL/XSLT/XPATH
    Réponses: 2
    Dernier message: 15/02/2005, 11h35
  4. Comment récupérer le numéro de la semaine ?
    Par claude dans le forum Langage
    Réponses: 7
    Dernier message: 25/06/2004, 15h06
  5. [xml] Récupérer le numéro de la ligne d'erreur d'un fichier
    Par ZoumZoumMan dans le forum C++Builder
    Réponses: 7
    Dernier message: 20/03/2004, 19h09

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