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

Persistance des données Java Discussion :

Mise à jour clé primaire merge()?


Sujet :

Persistance des données Java

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Mai 2010
    Messages
    34
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2010
    Messages : 34
    Points : 13
    Points
    13
    Par défaut Mise à jour clé primaire merge()?
    Bonjour j'ai une petite question à poser, j'ai un peu de mal à comprendre la méthode merge().
    Dans mon cas je souhaite modifier des élément d'une table:
    - quand je modifie autre chose que la clé primaire en utilisant la méthode merge, pas de soucis.
    - quand je modifie la clé primaire pour une nouvelle clé, si celle-ci n'existe pas il me crée un objet avec les nouvelles informations et je suis obliger de supprimer l'ancien objet avec remove.
    -enfin quand je modifie la clé primaire par une clé existante il m'écrase les informations de la donné existante.

    Les deux derniers cas me semblent assez bizarre, j'ai l'impression de mal avoir compris le principe du merge et la différence entre merge et flush j'aurais même penser que l'entitymanager aurait levé une exception pour le 3eme cas comme il le fait quand il persist (constraintsqlexception).

    Merci de m'éclairer, bonne journée.

  2. #2
    Expert confirmé
    Profil pro
    Inscrit en
    Août 2006
    Messages
    3 274
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 3 274
    Points : 4 166
    Points
    4 166
    Par défaut
    Flush envoie les instructions SQL à la base.

    Merge permet la mise à jour d'un objet en session mais le changement en base n'intervient qu'après le flush.

    On ne modifie pas une clé primaire en base.
    Donc il est logique qu'un nouvel objet soi créé s'il n'existe pas.
    Si l'objet existe, ses valeurs seront modifiées.

  3. #3
    Membre expert
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2007
    Messages
    2 938
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Juin 2007
    Messages : 2 938
    Points : 3 938
    Points
    3 938
    Par défaut
    Bonjour,
    Ton post n'est pas sur le bon forum, tu devrai le mettre dans le forum de persistence, mais je réponds néanmoins avant que les admins ne le déplacent:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    - quand je modifie autre chose que la clé primaire en utilisant la méthode merge, pas de soucis.
    Normal, c'est le fonctionnement prévu de merge, il met à jour les données présentes en mémoire, avec celles présentes en bd, ce rien que pour l'objet présent en base.c'est un "update" en d'autres termes.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    - quand je modifie la clé primaire pour une nouvelle clé, si celle-ci n'existe pas il me crée un objet avec les nouvelles informations et je suis obliger de supprimer l'ancien objet avec remove.
    Par principe on ne modifie pas la clé primaire d'un enregistrement,c'est un principe fondamental à la notion de base de donnée, c'est normal que merge se positionne sur l'enregistrement dont la clé primaire est définie dans l'objet que tu veux mettre à jour.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    j'ai l'impression de mal avoir compris le principe du merge et la différence entre merge et flush
    Flush quant à lui ne prend pas de paramètres, mais son role est plus général, il synchronise toutes les entités attachés avec la base de donnée, il faut généralement l'utiliser si tu es en politique auto_commit=false et que tu veux déconnecter un user, moi perso je ne le fais pas souvent car c'est couteux, donc mon auto commit est en général à true.
    Voila voila
    Vous avez peut être hâte de réussir et il n'y a rien de mal à cela...
    mais la patience est aussi une vertu; l'échec vous l'enseignera certainement..."

  4. #4
    Membre à l'essai
    Profil pro
    Inscrit en
    Mai 2010
    Messages
    34
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2010
    Messages : 34
    Points : 13
    Points
    13
    Par défaut
    Et pour un remove c'est pareil, il supprime en base après le flush?
    Merci pour les infos.

  5. #5
    Expert confirmé
    Profil pro
    Inscrit en
    Août 2006
    Messages
    3 274
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 3 274
    Points : 4 166
    Points
    4 166
    Par défaut
    Le mode auto-commit est déconseillé dans la documentation.
    En effet, on perd tout l'intérêt d'une transaction.

    Le flush sert notamment lorsque l'on doit insérer beaucoup de données en base, pour ne pas faire exploser le cache de premier niveau.

  6. #6
    Membre expert
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2007
    Messages
    2 938
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Juin 2007
    Messages : 2 938
    Points : 3 938
    Points
    3 938
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Le mode auto-commit est déconseillé dans la documentation.
    En effet, j'ai vérifié, je ne modifie jamais ce paramètre, par défaut il doit être à false je suppose, toutes mes transactions sont gérées par injection Spring, je ne fais donc jamais de flush, merge et persist me suffisent.
    Vous avez peut être hâte de réussir et il n'y a rien de mal à cela...
    mais la patience est aussi une vertu; l'échec vous l'enseignera certainement..."

  7. #7
    Membre à l'essai
    Profil pro
    Inscrit en
    Mai 2010
    Messages
    34
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2010
    Messages : 34
    Points : 13
    Points
    13
    Par défaut
    Merci pour les informations, j'ai refais un peu ma base pour qu'elle soit plus "propre" (clés primaires = id) par contre j'ai un petit problème toujours avec mon merge(), je n'arrive pas à capturer l'exception lorsqu'il viole une contrainte unique avec un try catch pourtant je suis aller franchement avec un catch (exception e) mais cela ne capture pas mon exception.(Caused by: org.hibernate.exception.ConstraintViolationException,Caused by: java.sql.BatchUpdateException)

Discussions similaires

  1. Problème de mise à jour avec utilisation de merge
    Par methodman225 dans le forum JPA
    Réponses: 1
    Dernier message: 01/06/2010, 12h26
  2. Réponses: 1
    Dernier message: 17/02/2010, 08h34
  3. Mise à jour clée primaire
    Par kfmystik dans le forum kettle/PDI
    Réponses: 5
    Dernier message: 11/09/2008, 15h59
  4. Mise à jour sur clés primaires
    Par belsuncette dans le forum Requêtes et SQL.
    Réponses: 14
    Dernier message: 25/07/2007, 07h45
  5. requête VBA mise à jour et clé primaire
    Par kiki.gaby dans le forum Requêtes et SQL.
    Réponses: 3
    Dernier message: 17/01/2007, 19h00

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