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

JPA Java Discussion :

2 Merge sur même objet = erreur


Sujet :

JPA Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Profil pro
    100
    Inscrit en
    Juillet 2007
    Messages
    585
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations professionnelles :
    Activité : 100

    Informations forums :
    Inscription : Juillet 2007
    Messages : 585
    Par défaut 2 Merge sur même objet = erreur
    Bonjour,

    J'ai dans une page xhtml de mon applic un tableau contenant des objets.
    Lorsque j'édite un objet, je fais ensuite un merge de ce même objet.

    Or si je fais à autre merge de ce même objet sans avoir recharger ma page, j'obtiens l'erreur suivante :
    Exception Description: The object [ch.test.application.beans.heures.Heure@70e] cannot be merged because it has changed or been deleted since it was last read.
    Class> ch.test.application.beans.heures.Heure
    at org.eclipse.persistence.exceptions.OptimisticLockException.objectChangedSinceLastMerge(OptimisticLockException.java:152)
    at org.eclipse.persistence.internal.sessions.MergeManager.mergeChangesOfCloneIntoWorkingCopy(MergeManager.java:578)
    at org.eclipse.persistence.internal.sessions.MergeManager.mergeChanges(MergeManager.java:313)
    at org.eclipse.persistence.internal.sessions.UnitOfWorkImpl.mergeCloneWithReferences(UnitOfWorkImpl.java:3521)
    at org.eclipse.persistence.internal.sessions.RepeatableWriteUnitOfWork.mergeCloneWithReferences(RepeatableWriteUnitOfWork.java:384)
    at org.eclipse.persistence.internal.sessions.UnitOfWorkImpl.mergeCloneWithReferences(UnitOfWorkImpl.java:3481)
    at org.eclipse.persistence.internal.jpa.EntityManagerImpl.mergeInternal(EntityManagerImpl.java:542)
    ... 122 more
    Je comprends bien que c'est parce qu'il détecte une modification entre temps mais comment résoudre ce problème ?
    Merci pour 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
    quand tu fais un merge d'un objet, tu obtiens en réponse l'objet persistant correspondant au merge. C'est ce dernier que tu devra modifier par la suite. Je gage que tu continue à modifier l'ancien.

  3. #3
    Membre éclairé
    Profil pro
    100
    Inscrit en
    Juillet 2007
    Messages
    585
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations professionnelles :
    Activité : 100

    Informations forums :
    Inscription : Juillet 2007
    Messages : 585
    Par défaut
    Effectivement je modifie le même, mais comme l'objet modifié fait partie d'un tableau, je n'ai pas vraiment le choix que de recharger la liste, non ?

  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
    tu peux faire tableau[i] = merge(tableau[i]), mais si tableau fait partie d'un autre objet jpa, c'est l'objet jpa en question qu'il vaudra mieux recharger.

  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
    Citation Envoyé par doons Voir le message
    Effectivement je modifie le même, mais comme l'objet modifié fait partie d'un tableau, je n'ai pas vraiment le choix que de recharger la liste, non ?
    En fonction de ce que tu as écrit, tu pourrais aussi remplacer directement l'élément modifié dans ta liste, tu recherches l'ancien et tu le remplace par le nouveau...
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  6. #6
    Membre éclairé
    Profil pro
    100
    Inscrit en
    Juillet 2007
    Messages
    585
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations professionnelles :
    Activité : 100

    Informations forums :
    Inscription : Juillet 2007
    Messages : 585
    Par défaut
    J'ai essayé de remplacer le bean dans la liste comme 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 enregistrerModification(RowEditEvent event) {
         Heure heure = (Heure) event.getObject();
         Heure heureUpdated = null;
         if (heure.getMandat() != null && heure.getDate() != null) {
                 if (heure.getId() > 0) {
    		     heureUpdated = m_heureService.updateHeure(heure);
         	     } else {
    	             heureUpdated = m_heureService.createHeure(heure);
                 }
         }
     
         List<Heure> lstH = mapDateHeures.get(getCurrentDate());
         lstH.remove(heure);
         lstH.add(heureUpdated);
         mapDateHeures.put(getCurrentDate(), lstH);
    }
    Le problème est que ci j'ai par exemple 2 items dans le tableau, après exécution de la méthode il affiche 2 fois le même item.
    La mise à jour se fait avec ajax :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    <p:ajax event="rowEdit" listener="#{saisirHeuresForm.enregistrerModification}" />
    Si je rafraichis avec F5, j'ai les 2 items distinct.

    J'utilise une map car c'est un formulaire de saisie des heures effectuées dans la journée et il est possible de se déplacer de jours en jours. J'ai donc une map avec une liste d'heure correspondantes à jour.

    Est-ce qu'il me manque encore un truc pour que ça marche ?

    Merci à vous

  7. #7
    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
    Je suppose que ta ligne lstH.remove(heure); ne fonctionne pas, peux-tu vérifier ?
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

Discussions similaires

  1. Réponses: 17
    Dernier message: 19/09/2012, 16h52
  2. Réponses: 0
    Dernier message: 18/09/2012, 11h56
  3. Réponses: 10
    Dernier message: 23/10/2007, 14h02
  4. plusieurs readlines sur un même objet fichier
    Par julien.63 dans le forum Général Python
    Réponses: 6
    Dernier message: 03/08/2007, 10h06
  5. [POO] Erreur suite à un cast sur un objet
    Par RogerB dans le forum Langage
    Réponses: 3
    Dernier message: 02/11/2006, 13h56

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