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

Hibernate Java Discussion :

Hibernate + mise à jour d'un enregistrement


Sujet :

Hibernate Java

  1. #1
    Membre confirmé Avatar de jdev23
    Profil pro
    Étudiant
    Inscrit en
    Août 2006
    Messages
    99
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : Maroc

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Août 2006
    Messages : 99
    Par défaut Hibernate + mise à jour d'un enregistrement
    Salut;
    j'ai voulu mettre à jour un enregistrement de la table user,le code de la fct modifier :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
     org.hibernate.Session session = HibernateUtil.currentSession();
    org.hibernate.Query query = session.createQuery("from user as u where u.login='"+d.getLogin()+"'");
    User u= (User)query.list().get(0);            
    org.hibernate.Transaction tx = session.beginTransaction();
    u=d;
    session.save(u) ;
    tx.commit();
    Alors que l'objet "d" est lié aux zones de textes ou normalement l'utilisateur va saisir les nouvelles valeurs de l'enregistrement.

    j'ai essayé avec cette fct mais ça ne marche pas,je sais pas ou j'ai commis l'erreur.

  2. #2
    Membre averti
    Inscrit en
    Août 2007
    Messages
    30
    Détails du profil
    Informations forums :
    Inscription : Août 2007
    Messages : 30
    Par défaut
    Essaie de commencer la transaction avant d'exécuter ta requête HQL

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    org.hibernate.Session session = HibernateUtil.currentSession();
    org.hibernate.Transaction tx = session.beginTransaction();
    org.hibernate.Query query = session.createQuery("from user as u where u.login='"+d.getLogin()+"'");
    User u= (User)query.list().get(0);            
    u=d;
    session.save(u) ;
    tx.commit();

  3. #3
    Membre confirmé Avatar de jdev23
    Profil pro
    Étudiant
    Inscrit en
    Août 2006
    Messages
    99
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : Maroc

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Août 2006
    Messages : 99
    Par défaut
    je l'ai fait mais toujours rien

  4. #4
    Membre expérimenté Avatar de aperrin
    Profil pro
    Inscrit en
    Octobre 2005
    Messages
    221
    Détails du profil
    Informations personnelles :
    Âge : 53
    Localisation : France

    Informations forums :
    Inscription : Octobre 2005
    Messages : 221
    Par défaut
    Recopie les valeur de d dans u (pas d'affectation de référence). Sinon il y a fort à parier qu'hibernate insert une nouvelle donnée.

  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
    Qu'est ce qui ne marche pas au juste ?
    As-tu une erreur, une log, quelque chose à nous montrer ?

    J'ai déjà repéré une erreur dans ta requête, il faut faire
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    session.createQuery("from User where login = ...");
    Pour bien faire, il serait préférable d'écrire
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    session.createQuery("from User where login = :login").setString("login", d.getLogin());
    Et à priori, je suppose que login est la clé primaire User, il faudrait utiliser l'accès direct
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    User u = session.get(User.class, d.login());
    A+
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  6. #6
    Membre chevronné
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    383
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2007
    Messages : 383
    Par défaut
    jdev23, pourquoi tu fais

    ??

    Ca sert à quoi ?

  7. #7
    Membre confirmé Avatar de jdev23
    Profil pro
    Étudiant
    Inscrit en
    Août 2006
    Messages
    99
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : Maroc

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Août 2006
    Messages : 99
    Par défaut
    Merci pour vos réponse,

    j'ai pas de messages d'erreur mais lorsque je clique la première fois sur le bouton modifier,j'ai une exception "violation de la clé primaire,objet deja existe dans la BD" alors lors du deuxième clic la moification se fait correctement.


    pour la ligne u=d; c'est pour affecter les nouvelles valeur à l'enregistrement u,sachant que l'objet d est lié aux zones de textes ou l'utilisateur va saisir les nouvelles valeurs

  8. #8
    Membre expérimenté Avatar de aperrin
    Profil pro
    Inscrit en
    Octobre 2005
    Messages
    221
    Détails du profil
    Informations personnelles :
    Âge : 53
    Localisation : France

    Informations forums :
    Inscription : Octobre 2005
    Messages : 221
    Par défaut
    u=d fait une affectation par référence. Pour une recopie de donnée il vaut mieux utiliser la bibliothèque apache bean utils

  9. #9
    Membre confirmé Avatar de jdev23
    Profil pro
    Étudiant
    Inscrit en
    Août 2006
    Messages
    99
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : Maroc

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Août 2006
    Messages : 99
    Par défaut
    il vaut mieux utiliser la bibliothèque apache bean utils


    j'ai pas compris !

  10. #10
    Membre chevronné
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    383
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2007
    Messages : 383
    Par défaut
    J'ai l'impression que tu mélanges plusieurs choses.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    User u= (User)query.list().get(0);
    Là u est de type User qui est une entité Hibernate.

    En suite tu fais :
    Je comprends toujours pas pourquoi tu écrases tout de suite la valeur que tu viens de récupérer de la base pour u ??

    Mais bref, si ce User d est un objet détaché qui vient de l'interface utilisateur, il doit être réattaché (et sauvegardé en base) avec la méthode saveOrUpdate().

  11. #11
    Membre confirmé Avatar de jdev23
    Profil pro
    Étudiant
    Inscrit en
    Août 2006
    Messages
    99
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : Maroc

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Août 2006
    Messages : 99
    Par défaut
    j'écrase la valeur que je vien de récupérer de la BD pour modifier l'enregistrement u et mettre à sa place l'enregistrement d,avec les valeurs de d sont des valeurs qui viennent de l'interface utilisateur

  12. #12
    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
    Ce n'est pas comme ça qu'on procède.
    Il faut copier les propriétés de d vers celles de u et persister u.
    Il y a plusieurs possibilités pour ça :
    - save()
    - update()
    - merge()
    - saveOrUpdate()
    (voir la doc pour les différences)

    u est une instance de User, d est une instance de quoi ?

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

  13. #13
    Membre confirmé Avatar de jdev23
    Profil pro
    Étudiant
    Inscrit en
    Août 2006
    Messages
    99
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : Maroc

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Août 2006
    Messages : 99
    Par défaut
    d est aussi une instance de type User,je sais pas mai est ce que le passage par référence ne va copier les prtés de l'bjet d dans u ?

  14. #14
    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
    Ben non...

    Si tu veux, u contient l'adresse d'un objet User et d aussi.
    Quand tu fais u = d, tu fais "pointer" (la référence) u vers l'objet "pointé" par d.
    En aucun cas tu ne copies les propriétés de l'objet (pointé par) d vers l'objet (pointé par) u
    Pour cela, il faut utiliser BeanUtils.copyProperties(objetCible, objetSource)

    (org.apache.commons.beanutils.BeanUtils)

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

  15. #15
    Membre chevronné
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    383
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2007
    Messages : 383
    Par défaut
    Oui, tout ce que dit OButterlin est correct.
    Par contre que fait cet objet User d, qui est une entité Hibernate, dans l'interface utilisateur ? Soit c'est une entité qui a été détachée de la session, auquel cas il suffit de la réattacher avec saveOrUpdate() par exemple; soit c'est un DTO (Data Transfert Object) qui contient les mêmes champs que l'entité User, mais qui n'est pas une entité au sens Hibernate du terme, auquel cas tu fais une copie des champs de UserDTO vers User (comme l'a expliqué OButterlin).
    Il y a là un choix à faire.
    Personnellement je te conseille d'utiliser des Entity détachée, comme ça tu n'as pas a dupliquer toutes les entités de ton application dans des DTO.
    Explication sur l'état des objets hibernate et les objets détachés :
    http://www.hibernate.org/hib_docs/re...jectstate.html

  16. #16
    Membre confirmé Avatar de jdev23
    Profil pro
    Étudiant
    Inscrit en
    Août 2006
    Messages
    99
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : Maroc

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Août 2006
    Messages : 99
    Par défaut
    Merci les amis c'est résolu

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

Discussions similaires

  1. Réponses: 0
    Dernier message: 19/02/2008, 11h35
  2. Mise à jour d'un enregistrement
    Par yagrasdemonde dans le forum Access
    Réponses: 6
    Dernier message: 08/03/2007, 22h32
  3. [Hibernate] mise à jour des éléments des détails
    Par neuromencien dans le forum Hibernate
    Réponses: 9
    Dernier message: 16/02/2007, 14h47
  4. [D7][MySQL4.11][Débutant] Mise à jour d'un enregistrement
    Par birdytech dans le forum Bases de données
    Réponses: 1
    Dernier message: 29/01/2007, 09h53
  5. Mise à jour d'un enregistrement
    Par THkiller dans le forum VB 6 et antérieur
    Réponses: 8
    Dernier message: 28/08/2006, 14h36

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