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

Développement Web en Java Discussion :

different object with the same identifier was already associated with the session


Sujet :

Développement Web en Java

  1. #1
    Membre régulier Avatar de lextaz33
    Profil pro
    Développeur informatique
    Inscrit en
    Avril 2008
    Messages
    169
    Détails du profil
    Informations personnelles :
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2008
    Messages : 169
    Points : 81
    Points
    81
    Par défaut different object with the same identifier was already associated with the session
    Bonjour la communauté,
    Voila j'ai un problème connu et vu sur le forum, mais je n'y ai pas trouvé de remède encore. (L'erreur est le titre du post)

    Dans ma méthode, je load un objet ElementPrescriptionBean puis un objet StatutBean.
    Avec cet objet statut, je modifie mon ElementPrescriptionBean avec un setStatutBean(statut) avant de le sauvegarder en base.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    ElementPrescriptionBean element = (ElementPrescriptionBean) load(user, criterion);
    StatutBean statut = (StatutBean) load(user, crit);
    element.setStatutBean(statut);
    save(element);
    Alors en général, on tombe sur cette erreur sur la sauvegarde d'un élément, ca m'est déjà arrivé et un flush ou un evict sur l'objet en session réglait le problème.

    Seulement l'erreur me saute sur le load de l'objet StatutBean. Et si je retire le load du statut, j'ai la même erreur sur le load de ElementPrescriptionBean.
    Sachant que l'erreur reste la même (weboffice.databean.StatutBean#1) que ce soit sur le load du statut ou de l'élément de prescription.
    "Sounds Weird" comme dirai les ricains!!!

    Voila je comprend pas, ce code a fonctionné toute la semaine et ce matin biiim ca passe plus.???!!!
    Si quelqu'un peut m'aider ou me mettre sur une voie royale ca m'arrangerait bien.
    Merci d'avance.

    PS: Ultra Urgent en mode really really urgent!!!

  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
    Deux choses:
    - le save sert à persister en base un objet non persistant (ce qui n'est pas ton cas), donc il semble inutile.
    - le message est clair, tu as déjà un objet avec le même id dans la session. Il faut donc comprendre pourquoi. Est-ce que ta session est partagée par plusieurs utilisateurs ? Est-ce tu exécutes un traitement avant celui-ci qui place tes objets dans la session ?

    Sans plus d'infos il sera difficile de t'aider.

  3. #3
    Membre régulier Avatar de lextaz33
    Profil pro
    Développeur informatique
    Inscrit en
    Avril 2008
    Messages
    169
    Détails du profil
    Informations personnelles :
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2008
    Messages : 169
    Points : 81
    Points
    81
    Par défaut
    Alors certes pour le save je suis d'accord, mais le problème n'est pas la.
    le message est clair, tu as déjà un objet avec le même id dans la session. Il faut donc comprendre pourquoi je suis la pour ca.

    Le load d'un objet crée une session donc elle est différente de celle qui a pu exister juste avant. Elle n'est pas partagé par plusieurs utilisateurs, et je ne met rien en session avant, je passe tout en paramètre, et je ne crée pas de session hibernate avant ce traitement. La seul session qui pourrait créer un problème se termine par un close(). je sais pas si ca suffit j'avoue, j'ai essayé un flush mais ca ne change rien.

  4. #4
    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 load, charge un objet dans ta session existante.
    Il ne crée pas de session.

    Si tu ne crées pas de session en rentrant dans ce process, c'est bien qu'elle est créée ailleurs, et que ailleurs on y a placé ton objet dedans.
    Il faut comprendre où.

  5. #5
    Membre régulier Avatar de lextaz33
    Profil pro
    Développeur informatique
    Inscrit en
    Avril 2008
    Messages
    169
    Détails du profil
    Informations personnelles :
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2008
    Messages : 169
    Points : 81
    Points
    81
    Par défaut
    Etant vraiment vraiment pressé par le temps, je dois régler ce problème.
    Je le contourne pour le moment avec une bonne vieille "roquette" SQL (comme disait mon prof de BDD préféré).

    Or, un peu plus loin dans mes tests je retombe sur la même erreur alors la je me dis c pas possible.

    Et la Je trouve dans une méthode qui s'éxecute après les load dont je vous fait part un autre load cette fois de ComposantBean (Si vous suivez toujours).

    Ce qui veut dire comme vous me dites qu'il y a bien une session quelquepart avant ma méthode. Mais la seul que je vois se termine par un session.flush() (j'avais dis close mais c flush()).

    Alors si c'est celle la que dois-je faire?? session.flush ne suffit pas apparemment?

  6. #6
    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 flush synchronise tes objets avec la base et donc ne vide pas ta session.
    Donc selon tes besoins et ton architecture, tu peux fermer la session close(), ou la vider clear().
    A toi de voir.

  7. #7
    Membre régulier Avatar de lextaz33
    Profil pro
    Développeur informatique
    Inscrit en
    Avril 2008
    Messages
    169
    Détails du profil
    Informations personnelles :
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2008
    Messages : 169
    Points : 81
    Points
    81
    Par défaut
    Alors il s'est avéré que la méthode qui charge mes objets au début du traitement était rappelé dans certains cas uniquement en fin de traitement pour autre chose (j'étais passé à côté pendant mes tests).
    Donc effectivement un objet chargé une fois lors du premier appel pouvait être rechargé lors du second appel.
    J'ai donc fais un session.clear() a la fin de ce traitement et je n'ai plus d'erreur.
    En croisant les doigts, c résolu!
    Merci

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

Discussions similaires

  1. Réponses: 2
    Dernier message: 10/06/2009, 23h28
  2. Réponses: 4
    Dernier message: 07/04/2009, 15h07
  3. Réponses: 1
    Dernier message: 12/01/2009, 18h52
  4. Réponses: 1
    Dernier message: 27/10/2008, 18h08
  5. Réponses: 2
    Dernier message: 27/07/2007, 10h21

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