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 :

getHibernateTemplate.update ne marche pas


Sujet :

Hibernate Java

  1. #1
    Inactif  
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    2 189
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : Suisse

    Informations forums :
    Inscription : Mai 2006
    Messages : 2 189
    Par défaut getHibernateTemplate.update ne marche pas
    Hello,

    Je rencontre des difficultés à mettre à jour un élément existant à l'aide de

    getHibernateTemplate.update (affaire) rien n est mise à jour

    j ai donc codé ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
     
    public void update(Affaire affaire) throws Exception {
    		LOG.debug("UPDATE AFFAIRE FROM DAO : " + affaire.getNoAffaire());
    		try{
    			Commune c = affaire.getCommunes().iterator().next();
    			delete(findByNoAffaire(affaire.getNoAffaire()));
    			affaire.addCommune(c);
    			LOG.debug("SAVE AFFAIRE WITH THIS COMMUNE AFTER DELETE " + affaire.getCommunes().iterator().next().getLibelleFr());
    			Object o = getHibernateTemplate().save(affaire);
    			if (o == null) {
    				LOG.error("ERROR SAVING AFFAIRE INSIDE UPDATE");
    			}
    		}catch (Exception ex) {
    			LOG.error("error while updating affaire" + ex.getMessage());
    			throw ex;
    		}
    	}
    mais la encore il arrive parfois (1 fois sur 10) que l affaire n est pas supprimé dans la base

    de quoi cela peut il provenir ?

  2. #2
    Membre éprouvé
    Profil pro
    Inscrit en
    Janvier 2009
    Messages
    92
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Janvier 2009
    Messages : 92
    Par défaut
    Pour analyser, il est préférable d'avoir la trace des requêtes SQL exécutées. Mais déjà, il y a qq ch de suspect dans le code quant à l'objet affaire. Voici le cycle de vie :

    1. "affaire" est passé en paramètre, probablement instance détachée => mettons que son id vaut 3
    2. delete(findByNoAffaire(affaire.getNoAffaire())) => suppression de l'affaire n°3 en base (du moins, l'id 3 est marqué pour être supprimé en base, le sql n'est pas généré tout de suite). A ce stade, l'objet affaire ci-dessus n'est pas impacté puisqu'il est détaché => son id en mémoire java reste à 3
    3. save(affaire) => affaire est réattaché à la session, avec un id non null, mais cet id est supposé être supprimé de la base => pas logique

  3. #3
    Inactif  
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    2 189
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : Suisse

    Informations forums :
    Inscription : Mai 2006
    Messages : 2 189
    Par défaut
    Hello,

    J'ai également testé une *version* ou :

    1) Je créer une transaction
    2) evict l'objet affaire de la session
    3) load affaire avec un session.get()
    4) delete l'objet affaire
    5) save l objet affaire
    6) commit la transaction

    Mais la je m'étais retrouvé face à l'exception suivante :

    org.hibernate.NonUniqueObjectException: a different object with the same identifier value was already associated with the session:

  4. #4
    Membre éprouvé
    Profil pro
    Inscrit en
    Janvier 2009
    Messages
    92
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Janvier 2009
    Messages : 92
    Par défaut
    as-tu essayé un flush entre le delete et le save ?

  5. #5
    Inactif  
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    2 189
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : Suisse

    Informations forums :
    Inscription : Mai 2006
    Messages : 2 189
    Par défaut
    Hello,

    Si je met un flush, j'obtiens l'exception suivante :

    Found two representations of same collection within affaireLiees

    En cherchant un peu j ai trouvé ceci :

    http://forum.hibernate.org/viewtopic.php?p=2231400

    mais ca ne sauvegarde pas les relations ... le code utilisé :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
     
    session.delete(affaire);
    session.flush(); 
    session.clear(); 
    session.evict(affaire);
    affaire.setAffairesLiees(new HashSet<Affaire>(affaire.getAffairesLiees()));
    affaire.setAuteurs(new HashSet<AuteurPlans>(affaire.getAuteurs()));
    affaire.setRequerants(new HashSet<Requerant>(affaire.getRequerants()));
    affaire.setCommunes(new HashSet<Commune>(affaire.getCommunes()));
    affaire.setParcelles(new HashSet<Localisation>(affaire.getParcelles()));
    Je me suis tourné donc à nouveau vers le session.update :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    Session session = getSession();
    session.getSessionFactory().openSession();
    Transaction tx = session.beginTransaction();
    session.update(affaire);
    tx.commit();
    session.close();
    mais cette fois lorsque je sauvegarde cela me créer deux affaires

  6. #6
    Membre éprouvé
    Profil pro
    Inscrit en
    Janvier 2009
    Messages
    92
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Janvier 2009
    Messages : 92
    Par défaut
    J'ai déjà rencontré un pb de double insertion : le pb venait d'une relation bi-directionnelle (one-to-many) dont les objets placés dans la collection ne redéfinissaient pas les méthodes equals() et hashCode()

  7. #7
    Inactif  
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    2 189
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : Suisse

    Informations forums :
    Inscription : Mai 2006
    Messages : 2 189
    Par défaut
    J'ai bien vérifié mes entités et le problème ne vient pas de là.

    ou alors peut être que je n'utilise pas les bonnes méthodes

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
     
    	/*
    	 * (non-Javadoc)
    	 * 
    	 * @see java.lang.Object#equals(java.lang.Object)
    	 */
    	@Override
    	public boolean equals(Object obj) {
    		return EqualsBuilder.reflectionEquals(this, obj);
    	}
     
    	/*
    	 * (non-Javadoc)
    	 * 
    	 * @see java.lang.Object#equals(java.lang.Object)
    	 */
    	@Override
    	public int hashCode() {
    		return HashCodeBuilder.reflectionHashCode(this);
    	}

  8. #8
    Membre éprouvé
    Profil pro
    Inscrit en
    Janvier 2009
    Messages
    92
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Janvier 2009
    Messages : 92
    Par défaut
    ok, alors il faut s'assurer que le pb ne vient pas des liens => si c'est possible, ce serait bien de faire une essai d'update en désactivant le mapping des liens (affairesLiees, auteurs...)

  9. #9
    Membre éprouvé
    Profil pro
    Inscrit en
    Janvier 2009
    Messages
    92
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Janvier 2009
    Messages : 92
    Par défaut
    je viens aussi de me souvenir d'un autre pb du genre que j'ai rencontré : je ne sais pas pourquoi, mais cela venait de l'HibernateTemplate de spring. Pour résoudre, j'avais modifié le code de façon à ne pas travailler avec l'HibernateTemplate, mais directement avec la session Hibernate que tu peux récupérer depuis HibernateDaoSupport...on ne sais jamais

  10. #10
    Inactif  
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    2 189
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : Suisse

    Informations forums :
    Inscription : Mai 2006
    Messages : 2 189
    Par défaut
    c'est justement ce que je suis entrain de faire

  11. #11
    Membre éprouvé
    Profil pro
    Inscrit en
    Janvier 2009
    Messages
    92
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Janvier 2009
    Messages : 92
    Par défaut
    ok, bonne chance !

  12. #12
    Inactif  
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    2 189
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : Suisse

    Informations forums :
    Inscription : Mai 2006
    Messages : 2 189
    Par défaut
    Le problème de duplicate semble avoir disparu.

  13. #13
    Membre éprouvé
    Profil pro
    Inscrit en
    Janvier 2009
    Messages
    92
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Janvier 2009
    Messages : 92
    Par défaut
    pour info, quelle était la solution ?

  14. #14
    Inactif  
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    2 189
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : Suisse

    Informations forums :
    Inscription : Mai 2006
    Messages : 2 189
    Par défaut
    J'effectue un delete à partir de mon findAffaireByNumero et ensuite un save ...

  15. #15
    Membre confirmé
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2008
    Messages
    146
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

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

    Informations forums :
    Inscription : Avril 2008
    Messages : 146
    Par défaut
    Citation Envoyé par *alexandre* Voir le message
    J'effectue un delete à partir de mon findAffaireByNumero et ensuite un save ...
    Je suis tombé dans le même problème , et cette solution n'est pas efficace ,
    t'aurais pus utiliser une requête pour la mise à jour de l'objet
    car dans mon cas , j'ai bcp de relations avec la classe principale
    et si je fais un delete je perd tout
    je suis à la recherche d'une autre solution

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

Discussions similaires

  1. pas d'erreur mais update qui marche pas
    Par gloppy dans le forum Requêtes
    Réponses: 2
    Dernier message: 06/12/2006, 15h49
  2. [Conception] [débutant] Update ne marche pas
    Par yvandube dans le forum PHP & Base de données
    Réponses: 5
    Dernier message: 16/06/2006, 19h28
  3. inner join pour requete update ne marche pas
    Par Garra dans le forum Requêtes
    Réponses: 4
    Dernier message: 25/01/2006, 13h14
  4. Réponses: 3
    Dernier message: 12/10/2005, 20h54
  5. requête update qui marche pas
    Par MrsFrizz dans le forum Langage SQL
    Réponses: 4
    Dernier message: 01/12/2004, 08h16

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