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

  1. #1
    Membre actif
    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
    Points : 270
    Points
    270
    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 sénior
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 481
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Belgique

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

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 481
    Points : 48 806
    Points
    48 806
    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 actif
    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
    Points : 270
    Points
    270
    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 sénior
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 481
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Belgique

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

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 481
    Points : 48 806
    Points
    48 806
    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 310
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 7 310
    Points : 9 522
    Points
    9 522
    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 actif
    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
    Points : 270
    Points
    270
    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 310
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 7 310
    Points : 9 522
    Points
    9 522
    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

  8. #8
    Membre actif
    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
    Points : 270
    Points
    270
    Par défaut
    Alors en debug tout fonctionne bien.
    Après remove et add, j'ai bien les 2 items différents dans la liste. C'est juste à l'affichage dans la datatable qu'il y a un soucis et qu'il affiche 2x le même

  9. #9
    Membre actif
    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
    Points : 270
    Points
    270
    Par défaut
    J'ai du m'embrouiller les pinceaux ou alors les modifs n'avaient pas été correctement publiées sur le serveur.
    J'ai de nouveau essayé et ça fonctionne bien.

    Merci pour votre aide

    [EDIT] Ha ben non m.....

  10. #10
    Membre actif
    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
    Points : 270
    Points
    270
    Par défaut
    Ha ben non, ça ne fonctionne toujours pas en fait.
    Le comportement décrit plus haut est toujours là, à savoir que les 2 items affichés ont les mêmes valeurs alors que la méthode getListHeure() qui retroune la liste des items à afficher dans la table renvoie bien les 2 items distincts

  11. #11
    Modérateur
    Avatar de OButterlin
    Homme Profil pro
    Inscrit en
    Novembre 2006
    Messages
    7 310
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 7 310
    Points : 9 522
    Points
    9 522
    Billets dans le blog
    1
    Par défaut
    Je vois que ton <p:ajax> ne fait pas d'update, as-tu essayé de rajouter
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    <p:ajax event="rowEdit" ... update="id_de_la_liste"/>
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  12. #12
    Membre actif
    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
    Points : 270
    Points
    270
    Par défaut
    Oui j'ai essayé mais ça ne change rien.
    D'ailleurs, j'ai des totaux par colonne en footer :
    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
    21
     
    <p:columnGroup type="footer">
                				<p:row>
                					<p:column colspan="4" style="text-align:right" footerText="#{msg['Totaux']} :" />
    				            	<p:column style="text-align:center" >
    				            		<f:facet name="footer">
                    						<h:outputText value="#{saisirHeuresForm.totalHeures}" >
                       							<f:convertNumber minFractionDigits="2" />
                    						</h:outputText>
                						</f:facet>
    				            	</p:column>
    				            	<p:column />
    				            	<p:column style="text-align:center" >
    				            		<f:facet name="footer">
                    						<h:outputText value="#{saisirHeuresForm.totalKm}" >
                       							<f:convertNumber minFractionDigits="2" />
                    						</h:outputText>
                						</f:facet>
    				            	</p:column>
                				</p:row>
                			</p:columnGroup>
    Qui ne se mettent pas non plus à jour, il faut aussi que je rafraichisse la page pour qu'ils soient à jour

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