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 :

Accès à un même enregistrement plusieurs fois pendant session


Sujet :

Hibernate Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre extrêmement actif Avatar de Mister Nono
    Homme Profil pro
    Ingénieur Mathématiques et Informatique
    Inscrit en
    Septembre 2002
    Messages
    2 242
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur Mathématiques et Informatique
    Secteur : Santé

    Informations forums :
    Inscription : Septembre 2002
    Messages : 2 242
    Par défaut Accès à un même enregistrement plusieurs fois pendant session
    Lorsque j'accède à un même enregistrement d'une table pendant une même session l'erreur suivante est soulevée :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    a different object with the same identifier value was already associated with the session [dao.Engin]
    L'insertion des lignes :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    session.flush();
    session.clear();
    ... entre les 2 accès à l'enregistrement évite cela.

    Est-normal et peut-on éviter l'ajout des 2 lignes de codes ?

    A+

  2. #2
    Membre Expert
    Profil pro
    Inscrit en
    Août 2006
    Messages
    3 276
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 3 276
    Par défaut
    Ca semble normal. Tu essaies de charger un objet qui est déjà dans la session.

    Pour éviter cela, tu as plusieurs solution.
    -celle que tu proposes
    -utiliser le session.evict
    -fermer ta session entre 2 transactions

  3. #3
    Membre extrêmement actif Avatar de Mister Nono
    Homme Profil pro
    Ingénieur Mathématiques et Informatique
    Inscrit en
    Septembre 2002
    Messages
    2 242
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur Mathématiques et Informatique
    Secteur : Santé

    Informations forums :
    Inscription : Septembre 2002
    Messages : 2 242
    Par défaut
    Merci pour ta réponse.

  4. #4
    Membre extrêmement actif Avatar de Mister Nono
    Homme Profil pro
    Ingénieur Mathématiques et Informatique
    Inscrit en
    Septembre 2002
    Messages
    2 242
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur Mathématiques et Informatique
    Secteur : Santé

    Informations forums :
    Inscription : Septembre 2002
    Messages : 2 242
    Par défaut
    Désolé mais après essais, ta solution semble ne pas fonctionner.

    Par exemple le code suivant :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    types.Engin engin = HibernateDaoFactory.getDaoEngin().getEnginById(
                                idEngin, session);
     
    engin.setIndexChampTexte(indexMax);
     
    session.evict(engin);
     
    HibernateDaoFactory.getDaoEngin().updateEngin(engin, session);
    ... soulève l'exception.

    La méthode evict() doit-elle s'utiliser de cette manière ?

    Merci par avance.

  5. #5
    Membre confirmé
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    135
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 135
    Par défaut
    Dans ta méthode : updateEngin(engin, session), je suppose que tu fais un session.update(tonObjet), or cet objet est déja persistant... Tu ne dois pas utiliser update dans ce cas ci, update dois etre utilisé pour rendre un objet détaché dans une session précédente a nouveau persistant dans ta nouvelle session.

    Mais au fait, je n'ai pas compris ce que tu voulais faire exactement...

    Il faudrait fermer et rouvrir une nouvelle session afin de rendre ton objet de persistant a détaché après tu pourrais soit le loader soit l'update a nouveau.

  6. #6
    Membre extrêmement actif Avatar de Mister Nono
    Homme Profil pro
    Ingénieur Mathématiques et Informatique
    Inscrit en
    Septembre 2002
    Messages
    2 242
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur Mathématiques et Informatique
    Secteur : Santé

    Informations forums :
    Inscription : Septembre 2002
    Messages : 2 242
    Par défaut
    Citation Envoyé par red210 Voir le message

    Mais au fait, je n'ai pas compris ce que tu voulais faire exactement...
    Voilà, voilou :

    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
    22
    23
     
    Session session = HibernateUtil.getSession();
    Transaction tx = session.beginTransaction();
     
     
    // récupération de l'objet engin
    types.Engin engin = HibernateDaoFactory.getDaoEngin().getEnginById(
                    idEngin, session);
     
    // traitement de tests
    ...
     
    // modification de cet objet suite aux tests
    engin.setIndexChampTexte(indexMax);
     
    // l'objet est mis à jour                    
    session.update(engin);
     
    // transaction et session OK
    tx.commit();
    session.flush();
    session.clear();
    session.close();
    Et j'ai l'exception suite à la ligne :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    session.update(engin);
    Et si je ne mets pas cette ligne la modification sur l'objet n'est pas pris en compte.

    Comment donc lire l'objet engin puis le modifier dans la même session ?

    Je dois utiliser la même session car je travaille dans un système multi-tâches (J2EE - Clients / Serveur).


    A+

  7. #7
    Membre Expert
    Profil pro
    Inscrit en
    Août 2006
    Messages
    3 276
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 3 276
    Par défaut
    Où se situe le début et la fin de ta transaction ?

    Si tu es au sein de la même transaction, tu n'as pas besoin de faire un update de ton objet.
    Un simple setXXX suffit. Les modifications seront répercutées au commit.

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

Discussions similaires

  1. Réponses: 4
    Dernier message: 21/11/2007, 12h19
  2. Comment ne pas enregistrer plusieurs fois une touche ?
    Par Jordinateur dans le forum SDL
    Réponses: 33
    Dernier message: 05/10/2007, 21h44
  3. Ouverture de la même JFrame plusieurs fois
    Par louby dans le forum Agents de placement/Fenêtres
    Réponses: 3
    Dernier message: 08/06/2006, 17h23
  4. [Thread] Exécuter la même instance plusieurs fois
    Par Nairolf7 dans le forum Concurrence et multi-thread
    Réponses: 3
    Dernier message: 21/04/2006, 22h07
  5. Sélectionner un même enregistrement deux fois...
    Par Manu0086 dans le forum Langage SQL
    Réponses: 11
    Dernier message: 02/02/2004, 13h09

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