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 :

Insertion en double dans ma bdd


Sujet :

Hibernate Java

  1. #1
    Membre éclairé
    Inscrit en
    Avril 2006
    Messages
    238
    Détails du profil
    Informations forums :
    Inscription : Avril 2006
    Messages : 238
    Par défaut Insertion en double dans ma bdd
    Bonjour,

    je développe actuellement une appli J2EE (Struts+Hibernate) et il faut dire que c'est ma première avec Hibernate.
    Allons à l'essentiel : l'utilisateur peut créer des fiches de signalisations grâce à un formulaire. Mon problème est que lorsqu'il valide le formulaire, j'ai de temps en temps (et c'est ce qui me perturbe le plus) des doublons dans ma base.
    Je vous donne un peu de code :

    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
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    public Integer createNewDemSout(Sig_Sout newSigSout, String appli,
    			String intervenant) {
    		intervenant = intervenant.toLowerCase();
    		Session session = HibernateUtil.getCurrentSession();
    		Transaction tx = session.beginTransaction();
    
    		T_Dem_S dem_S = new T_Dem_S();
    
    		String date_aff = newSigSout.getDate_aff();
    		String date_aff_H = newSigSout.getH_date_aff();
    		String date_aff_M = newSigSout.getM_date_aff();
    		String new_date_aff = getCorrectDate(date_aff, date_aff_H, date_aff_M);
    
    		dem_S.setDate_aff(new_date_aff);
    		dem_S.setLib_dem(newSigSout.getLib_dem());
    
    		dem_S.setRef_cli(new Integer(newSigSout.getRefus_client()).intValue());
    		dem_S.setDem_oga(new Integer(newSigSout.getDem_OGA()).intValue());
    		dem_S.setPaliatif(new Integer(newSigSout.getPaliatif()).intValue());
    
    		dem_S.setTps_eff(newSigSout.getTps_eff());
    		dem_S.setCommentaire(newSigSout.getCommentaire());
    
    		String etat = "Affectée";
    		if (!newSigSout.getDate_pec().trim().equals("")) {
    			String new_date_pec = getCorrectDate(newSigSout.getDate_pec(),
    					newSigSout.getH_date_pec(), newSigSout.getM_date_pec());
    			dem_S.setDate_pec(new_date_pec);
    			etat = "Prise En Compte";
    		}
    
    		dem_S.setApplication(appli);
    
    		dem_S.setCriticite(newSigSout.getCriticite());
    		dem_S.setOrig_dem(newSigSout.getOrig_dem());
    		dem_S.setType_peri(newSigSout.getType_peri());
    		dem_S.setTache(newSigSout.getTache());
    		dem_S.setEtat(etat);
    
    		T_Intervenant tIntervenant = (T_Intervenant) session.load(
    				T_Intervenant.class, intervenant);
    		tIntervenant.addFicheS(dem_S);
    		dem_S.setId_intervenant(intervenant);
    
    		session.saveOrUpdate(tIntervenant);
    		tx.commit();
    		session.flush();
    		session.clear();
    La partie en rouge est dûe car je fais une relation 1-N avec Hibernate (tutotrouvé ici : http://www.tellaw.org/index.php?2005...avec-hibernate)

    Si jamais vous pourriez m'éclaircir un peu, ça serait cool !
    Merci
    PS : je peux vous donner le code de la jsp et autres si vous en avez besoin.

  2. #2
    Membre Expert Avatar de willoi
    Profil pro
    Développeur informatique
    Inscrit en
    Décembre 2006
    Messages
    1 355
    Détails du profil
    Informations personnelles :
    Âge : 53
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Décembre 2006
    Messages : 1 355
    Par défaut
    Tu es sur que tu ne passe pas 2 fois dans la methode createNewDemSout(...)
    Verifie tes mappings et tes forward a struts pour etre sur que tu n appelle pas deux fois la meme action.

  3. #3
    Membre éclairé
    Inscrit en
    Avril 2006
    Messages
    238
    Détails du profil
    Informations forums :
    Inscription : Avril 2006
    Messages : 238
    Par défaut
    Non, sinon la création serait systématique...
    Je me trompe ?

  4. #4
    Membre Expert Avatar de willoi
    Profil pro
    Développeur informatique
    Inscrit en
    Décembre 2006
    Messages
    1 355
    Détails du profil
    Informations personnelles :
    Âge : 53
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Décembre 2006
    Messages : 1 355
    Par défaut
    Ben ca depend si tu appelle cette methode depuis plusieurs endroits differents.

    Arrives-tu a reproduire l erreur a volonte?

    Ah sinon j avais rencontre une erreur de ce type une fois sinplement en cliquant une deuxieme fois sur le lien avant que le page ne se recharge.Peut etre c est ca tout connement.

  5. #5
    Membre éclairé
    Inscrit en
    Avril 2006
    Messages
    238
    Détails du profil
    Informations forums :
    Inscription : Avril 2006
    Messages : 238
    Par défaut
    Je n'arrive pas à déterminer l'origine du problème et je ne sais pas répéter l'erreur à volonté...

    Personne ne peux me donner plus d'infos ?

  6. #6
    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
    Log ton contexte d'appel, ca permettera d'isoler la problématique (exemple passage dans une action doublé ..)

  7. #7
    Membre éclairé
    Inscrit en
    Avril 2006
    Messages
    238
    Détails du profil
    Informations forums :
    Inscription : Avril 2006
    Messages : 238
    Par défaut
    Est-ce que personne ne peux me guider vers la résolution de mon pb ?
    J'ai pensé à créer un traitement pour vérifier qu'un doublon ne s'est pas créé, mais ça ne semble pas être la meilleure solution...

  8. #8
    Membre Expert Avatar de willoi
    Profil pro
    Développeur informatique
    Inscrit en
    Décembre 2006
    Messages
    1 355
    Détails du profil
    Informations personnelles :
    Âge : 53
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Décembre 2006
    Messages : 1 355
    Par défaut
    Que dis ton log dans ces cas-la ?

  9. #9
    Membre éclairé
    Inscrit en
    Avril 2006
    Messages
    238
    Détails du profil
    Informations forums :
    Inscription : Avril 2006
    Messages : 238
    Par défaut
    Pour info,
    j'ai ajouté des print dans la servlet afin de voir quels traitements étaient effectués en double.
    Résultat des courses, ma servlet est appellée 2 fois du coup, j'ai deux demandes d'insertion dans la base.
    Willoi : tu parles des logs de Hibernate ? Si c'est le cas, j'ai deux insertions à la suite...
    On avance...

  10. #10
    Membre chevronné
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    365
    Détails du profil
    Informations personnelles :
    Localisation : Maroc

    Informations forums :
    Inscription : Janvier 2006
    Messages : 365
    Par défaut
    Salut,
    Ton problème n'est pas lié à Hibernate mais bien plutôt à Struts, un double submit qui appelle deux fois la même Action avec les mêmes données de formulaire. Et cela se produit soit en cliquant deux fois sur le bouton submit, soit en faisant un refresh de la page renvoyée après insertion, soit peut-être en cliquant sur le bouton Précédent du navigateur puis re-submit du formulaire ... Struts te permet de régler ce problème de double-submit en paramétrant un "token", et quant au refresh de la page, fais une petite recherche sur "send-redirect" en struts.
    Voilà, je n'ai pas tous les élements sous les yeux pour être plus précis, mais en principe tu devrais pouvoir t'en sortir avec un minimum de recherche google ou dans la doc struts. J'espère que ça aide.

  11. #11
    Membre Expert Avatar de willoi
    Profil pro
    Développeur informatique
    Inscrit en
    Décembre 2006
    Messages
    1 355
    Détails du profil
    Informations personnelles :
    Âge : 53
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Décembre 2006
    Messages : 1 355
    Par défaut
    Citation Envoyé par manblaizo
    Salut,
    Ton problème n'est pas lié à Hibernate mais bien plutôt à Struts, un double submit qui appelle deux fois la même Action avec les mêmes données de formulaire. Et cela se produit soit en cliquant deux fois sur le bouton submit, soit en faisant un refresh de la page renvoyée après insertion, soit peut-être en cliquant sur le bouton Précédent du navigateur puis re-submit du formulaire ... Struts te permet de régler ce problème de double-submit en paramétrant un "token", et quant au refresh de la page, fais une petite recherche sur "send-redirect" en struts.
    Voilà, je n'ai pas tous les élements sous les yeux pour être plus précis, mais en principe tu devrais pouvoir t'en sortir avec un minimum de recherche google ou dans la doc struts. J'espère que ça aide.
    Je confirme,cela m'etait arrivé.

  12. #12
    Membre éclairé
    Inscrit en
    Avril 2006
    Messages
    238
    Détails du profil
    Informations forums :
    Inscription : Avril 2006
    Messages : 238
    Par défaut
    Salut,

    en cherchant un peu, je me suis posé la question suivante :
    lors de la déclaration de mon form, je fais appel à un fonction javascript pour valider certains champs de mon form.
    Est si c'était mon code javascript qui "foutrait le bordel" (désolé pour la vulgarité des termes ) ?

    Voici le code de la jsp :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    <html:form action="validateChangeSig" onsubmit="return validerForm_OS();">
    Et voici le code de ma fonction js :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    function validerForm_OS() {
    var myBool = true;
     
    // traitements divers de vérification...
     
    	if(myBool){
    		document.forms[0].submit();
    		document.forms[0].buttonOK.disabled=true;
    	}
     
    	return myBool;	
    }
    Je me pose la question suivante :
    est-ce que cette fonction peut-être à l'origine de mon problème d'appel de servlet en double ?

    Mon problème c'est que je n'arrive pas à reproduire l'erreur à volonté.
    Ca me complique lourdement la recherche de solution...

    Merci à vous !

  13. #13
    Membre Expert Avatar de willoi
    Profil pro
    Développeur informatique
    Inscrit en
    Décembre 2006
    Messages
    1 355
    Détails du profil
    Informations personnelles :
    Âge : 53
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Décembre 2006
    Messages : 1 355
    Par défaut
    Tout a fait, c'est ce qui te crees l'erreur.
    Tu realises un submit, et qui possede un evenement associe (onsubmit), qui declenche une fonction dans laquelle de nouveau tu realises un submit (document.forms[0].submit().
    Donc tes donnees sont soumises 2 fois a ta servlet.

    Si tu veux realiser un controle avant de soumettre tes donnees, utilises un input type="button" et l'evenement onclick().
    Ensuite dans ta fonction, tu declenche le submit.

  14. #14
    Membre éclairé
    Inscrit en
    Avril 2006
    Messages
    238
    Détails du profil
    Informations forums :
    Inscription : Avril 2006
    Messages : 238
    Par défaut
    Merci, je m'en doutais bien que ça avit un rapport !
    Mon souci c'est que maintenant, je n'arrive plus à faire le submit
    Voici mon code (c'est du struts !):

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    <html:form action="validateChangeSig">
    ...
    <html:button property="submit" onclick="validerForm_S();"><fmt:message key="button.submit"/></html:button>
    Et ma fonction javascript (ne change pas...) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    	if(myBool){
    		document.forms[0].submit();
    		document.forms[0].buttonOK.disabled=true;
    	}
    Mais je ne sais plus ce que j'oublie (je ne suis pas obligé de mettre un bouton submit...????)

    Edit : C'est bon , j'ai réussi
    Merci à vous !

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

Discussions similaires

  1. Insertion de données dans une BDD Access
    Par LeMeD dans le forum VB.NET
    Réponses: 2
    Dernier message: 25/01/2010, 17h43
  2. [MySQL] php/mysql Insertion de données dans ma bdd
    Par djavrel dans le forum PHP & Base de données
    Réponses: 3
    Dernier message: 26/04/2009, 19h16
  3. insertion de photos dans une bdd access
    Par nboubeur dans le forum ASP
    Réponses: 5
    Dernier message: 25/08/2008, 17h14
  4. Insertion de données dans une BDD Oracle avec VB.NET
    Par DashRendar dans le forum Accès aux données
    Réponses: 7
    Dernier message: 23/01/2008, 09h47
  5. Réponses: 3
    Dernier message: 18/06/2007, 09h20

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