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 :

Update intempestif d'objets lors d'un save


Sujet :

Hibernate Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Étudiant
    Inscrit en
    Décembre 2007
    Messages
    66
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Décembre 2007
    Messages : 66
    Par défaut Update intempestif d'objets lors d'un save
    Bonjour,

    J'ai un sérieux problème d'update intempestif d'objets lorsque je fais un save d'un autre objet en base de donnée avec l'hibernate template.

    J'explique :

    Je load en DB une série d'objet que j'utilise pour construire un autre objet (non présent en DB, donc avec un id null). (En gros, mon nouvel objet contient des références à des objets existants).

    Lorsque j'enregistre mon nouvel objet, l'hibernate template me fait une série d'update sur tous les autres objets qui sont dans l'objet à enregistrer alors que ceux-ci n'ont pas été modifié...

    Ca me fait une énorme perte de performance cette histoire, d'où est-ce que cela peut venir ?

    Merci de votre aide.

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

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

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 482
    Par défaut
    il faudrait voir le shéma. Si t'as des relation one-to-many entre depuis tes anciens objet vers ton nouvel objet, il faut bien updater les tables des tes ancens objet pour mettre à jour la foreign-key vers ton nouvel objet.
    De plus, si t'as une relation nouvel-objet -> ancien objet dans laquel tu a mis un cascade update, il fait l'update des ces ancien objets aussi. Et si t'as activé le versioning dans hibernate, ca provoque vraisemblalement d'office des update de la db.

  3. #3
    Membre confirmé
    Profil pro
    Étudiant
    Inscrit en
    Décembre 2007
    Messages
    66
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Décembre 2007
    Messages : 66
    Par défaut
    Disons que j'ai 3 tables : A - B - C

    C contient des FK de B, et B contient des FK de A. (one to many à chaque fois)

    Je load A et B en DB, et je crée un nouvel objet C. Lorsque je sauve C, il va me faire un update de l'objet A et B alors qu'ils n'ont pas été modifié.
    Il n'y a que l'objet de la table C qui contient une FK vers la table B.

    Toutes mes cascades sont en save-update... Mais là, comme les objets des tables A et B n'ont pas été modifiés, ils ne devraient pas me faire d'update. Ou alors j'ai pas tout saisi.

    Merci.

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

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

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 482
    Par défaut
    donc t'as une relation B-> A et une relation C-> B, chacun étant de type many-to-one (plusieurs C vers un B, plusieurs B vers un A) et tu fais uniquement un new C() suivi de C.setB(B)? Si oui, vérifie que le code du setter ne tripatouille pas B en arrière plan et vérifie que t'as bien désactivé le versioning. Donne nous aussi éventuellement ton fichier de config et des bouts du fichier de mapping. Dis nous aussi si tous les champs de B et C sont bien mappé via les propriétés et non via les field (je suis pas expart de ce coté là, mais il me semble qu'hibernate n'a aucun moyen de savoir si un field a été modifié -> il passe d'office l'update à la db sans filtrage)

  5. #5
    Membre confirmé
    Profil pro
    Étudiant
    Inscrit en
    Décembre 2007
    Messages
    66
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Décembre 2007
    Messages : 66
    Par défaut
    Oui c'est exactement ça, à la différence que le B est directement dans le constructeur de C. Mais ça revient au même. Aucune modification de l'objet par la suite.

    Pas de versioning d'utilisé. Tous les champs sont mappé via les fichiers de config xml.

    Pour la config, cela passe par Spring...

    Et le fichier de mapping, par exemple B et C :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    <set name="c" inverse="true" lazy="false">
                <key>
                    <column name="id" not-null="true" />
                </key>
                <one-to-many class="C" />
            </set>
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    <many-to-one name="B" class="B" lazy="false" cascade="save-update" insert="true" update="false" fetch="select">
                <column name="id" not-null="true" />
            </many-to-one>

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

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

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 482
    Par défaut
    t'as un relation bidirectionnelle là: B->set<C> et C->B, donc forcément, à la fois B et C sont modifié. Si, niveau tables, seule la table C contient la relation, il faut indiquer sur la relation B->set<C> que cette relation est inverse (invert="true") sinon, elle participe au fait de savoir si B a été modifié (même si coté table y a rien). Même chose pour une potentielle relation A->set<B>

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

Discussions similaires

  1. Réponses: 2
    Dernier message: 22/05/2009, 02h54
  2. Index différent entre base et code lors d'un save
    Par franck95300 dans le forum Hibernate
    Réponses: 6
    Dernier message: 25/03/2008, 15h09
  3. Déplacement d'objets lors de l'execution
    Par pootchi dans le forum Interfaces Graphiques
    Réponses: 5
    Dernier message: 19/11/2007, 18h24
  4. Réponses: 1
    Dernier message: 06/09/2006, 18h11
  5. Réponses: 1
    Dernier message: 09/07/2005, 18h16

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