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 :

ID d'un élément persisté


Sujet :

Java EE

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Futur Membre du Club
    Inscrit en
    Décembre 2010
    Messages
    4
    Détails du profil
    Informations forums :
    Inscription : Décembre 2010
    Messages : 4
    Par défaut ID d'un élément persisté
    Bonsoir !

    Tout d'abord, bonne et heureuse année à tout le monde !

    Mais revenons à nos montons... Je développe un projet CPA utilisant les technologies Java Persistance et EJB (plus précisément des SessionBean). Dans la base de donnée, j'ai entre autre les 2 tables suivantes:
    - Client
    - Adresse

    Ces 2 Tables sont "mappés" par des classes entités, et les ID des nouvelles entrées sont géré par la BD elle même, grâce à la clause suivante:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    create table projetcpa.CLIENT(
    ns_client_id  integer  PRIMARY KEY GENERATED BY DEFAULT AS IDENTITY (START WITH 1, INCREMENT BY 1)
    Là où se situe mon problème, c'est lors de l'ajout d'un client. Je crée une nouvelle adresse, puis un nouvel objet client avec l'adresse que j'ai créé, sans toucher à l'ID (=0) d'aucune des deux classes, puis je vérifie les informations. Une fois les informations validés, je persist le client de cette manière :


    Les nouvelles informations sont bien ajoutées à la base de données, avec des ID correctes (1, 2, 3 ...), mais les attributs ID des entités que j'ai persisté ne sont pas modifiés, et restent donc à 0.
    L'EntityManager est géré par l'EJB, aucun problème la dessus, vu que tout fonctionne parfaitement pour les autres méthodes. Les entités ont été générés automatiquement, et les ID ont bien les tags pour la génération automatique:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Basic(optional = false)
    @Column(name = "NS_CLIENT_ID")
    private Integer nsClientId;

    Par contre, en retournant le client:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    CODE:
    em.persist(c);
    return c;

    Et en faisant dans le main:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    client = clientEJB.ajouterClient(client);

    Là ça marche, mais je comprends toujours pas pourquoi.
    En plus je ne peux pas détacher après le persist, vu que dès que je le fait, j'ai de nouveau 0 comme ID.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    em.persist(c);
    em.detach(c);
    return c;

    N'y a t'il pas un moyen de modifier directement l'ID de l'objet en paramètre, en l'ayant détaché de la BD ?

    Merci pour votre aide

  2. #2
    Membre chevronné
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    365
    Détails du profil
    Informations personnelles :
    Localisation : Maroc

    Informations forums :
    Inscription : Janvier 2006
    Messages : 365
    Par défaut
    Citation Envoyé par Jiraiya-08 Voir le message

    Par contre, en retournant le client:

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

    Et en faisant dans le main:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    client = clientEJB.ajouterClient(client);

    Là ça marche, mais je comprends toujours pas pourquoi.
    Je ne te comprend pas tout à fait, est-ce que ça marche ou ça ne marche pas?
    Le fait de configurer @GeneratedValue(strategy = GenerationType.IDENTITY) permet à l'implémentation JPA de savoir que l'id est généré par la base de données, et donc ne pourrait y avoir accès qu'une fois la transaction terminée et que le commit a été fait.
    En faisant un em.detach(c) avant le retour de la méthode dans laquelle tu persiste l'objet, et donc avant la fin de la transaction, tu auras nécessairement un id == null.

    Je pense que tu n'as pas besoin de faire un detach() puisque de toutes les façons, à la fin de la transaction, le persistence context est fermé et ton objet se retrouve à l'état détaché.

    J'espère que c'est bien ça le problème.

Discussions similaires

  1. Réponses: 4
    Dernier message: 19/03/2015, 18h31
  2. [Algo] Trouver un arrangement ou une combinaison d'éléments
    Par Morvan Mikael dans le forum Algorithmes et structures de données
    Réponses: 16
    Dernier message: 20/04/2013, 11h46
  3. Afficher couleur et infos au survol qui reste persistant après avoir survolé l'élément
    Par majo59 dans le forum Balisage (X)HTML et validation W3C
    Réponses: 5
    Dernier message: 15/06/2011, 11h56
  4. Récupérer liste d'éléments persistés
    Par GiZeus dans le forum JPA
    Réponses: 1
    Dernier message: 08/06/2011, 16h31
  5. listView sur une colonne + persistance focus élément
    Par goran kajfes dans le forum Framework .NET
    Réponses: 2
    Dernier message: 16/11/2009, 10h35

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