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 :

Enregistrement une fois sur deux !


Sujet :

Hibernate Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre Expert
    Avatar de Alexandre T
    Homme Profil pro
    Chef de projets AMO
    Inscrit en
    Mai 2002
    Messages
    1 213
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Chef de projets AMO
    Secteur : Transports

    Informations forums :
    Inscription : Mai 2002
    Messages : 1 213
    Par défaut Enregistrement une fois sur deux !
    Bonjour,

    Je suis confronté à un problème que je n'ai jamais observé auparavant. Une fois sur deux le même code échoue ! Voici mon problème.

    J'enregistre un circuit. Ce circuit(cir) appartient à un centre (cei). Ce centre appartient à un district.

    Voici le code de la fonction doExecute de ma classe EnregistrerCeiAction héritant de ActionForm :
    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
       public ActionForward doExecute(ActionMapping mapping, AbstractActionForm form, HttpServletRequest request, HttpSession session, HttpServletResponse response, String idContexte, String sousAction) throws TechniqueException, RegleGestionException {
     
           Cir unCir = new Cir();
           CirForm cirForm = (CirForm) form;
           ServiceFactory serviceFactory = ServiceFactory.getInstance();
           ICirService cirService = serviceFactory.getCirService();
           ICeiService ceiService = serviceFactory.getCeiService();
           Cei unCei = (Cei)ceiService.rechercherParId(cirForm.getCei(),idContexte);
     
           if (cirForm.getId() == 0) {
               cirService.creer(unCir, idContexte);
           } else {
               unCir = (Cir)cirService.rechercherParId(cirForm.getId(),idContexte);
           }
     
           unCir.setLibelle(cirForm.getLibelle());
           unCir.setActif(false);
           unCir.setId(cirForm.getId());
           unCir.setCei(unCei);
           //TODO VALIDER le libelle
     
           cirService.save(unCir, idContexte);
           request.setAttribute(Constantes.CIR_FORM, unCir);
           return mapping.findForward("succes");
       }
    Au premier essai l'enregistrement ne fonctionne pas et me retourne une erreur :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    Caused by: java.sql.BatchUpdateException: L'élément du batch 0 update te_cei_cei set cei_lib=CEI Champigneulles, cei_nature=VRU , dis_id=NULL, zon_id=3 where cei_id=9 a été annulé. Appeler getNextException pour en connaître la cause.
    	at org.postgresql.jdbc2.AbstractJdbc2Statement$BatchResultHandler.handleError(AbstractJdbc2Statement.java:2392)
    	at org.postgresql.core.v3.QueryExecutorImpl.processResults(QueryExecutorImpl.java:1257)
    	at org.postgresql.core.v3.QueryExecutorImpl.execute(QueryExecutorImpl.java:334)
    	at org.postgresql.jdbc2.AbstractJdbc2Statement.executeBatch(AbstractJdbc2Statement.java:2451)
    	at org.hibernate.jdbc.BatchingBatcher.doExecuteBatch(BatchingBatcher.java:57)
    	at org.hibernate.jdbc.AbstractBatcher.executeBatch(AbstractBatcher.java:174)
    Bon déjà, je ne lui ai jamais demandé de modifier le centre... Mais là n'est pas le plus surprenant. Je remarque que la séquence sur la table circuit s'est incrémenté, il a donc bien enregistré le circuit avec l'id 10. Après il fait cet update et j'en ignore la raison... Comme il y a une erreur (dis_id ne peut être null) il ne valide pas la transaction (aucun commit).

    Et là j'actualise la page et tout s'enregistre correctement avec un circuit ayant comme id 11.

    J'actualise à nouveau, j'obtiens l'erreur. Le circuit id 12 n'est pas créé.

    J'actualise à nouveau, tout marche, le circuit id 13 est créé, etc..., etc...

    J'ai essayé de contrôler le cei avant le mon test if en ajoutant cette ligne de code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
           if (unCei.getDis() == null || unCei.getDis().getId() == 0){
               throw new RegleGestionException("District vide !");
           }
    L'erreur de gestion n'est jamais levée. Le soucis vient donc de quelquechose que je ne comprends vraiment pas !

    Une idée de l'origine du problème ?
    Alexandre Tranchant
    Chef de projet AMO pour le Cerema.
    Retrouvez mes articles sur PHP et Symfony

  2. #2
    Membre Expert
    Avatar de Alexandre T
    Homme Profil pro
    Chef de projets AMO
    Inscrit en
    Mai 2002
    Messages
    1 213
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Chef de projets AMO
    Secteur : Transports

    Informations forums :
    Inscription : Mai 2002
    Messages : 1 213
    Par défaut
    J'ai trouvé un début d'explication. Le problème ne vient pas de Struts mais d'un mauvais mapping hibernate apparement.

    J'ai modifié mon mapping hibernate. (Et je déplace le sujet du forum Struts vers le forum hibernate au passage)

    J'avais :

    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
     
    <?xml version="1.0" encoding="UTF-8"?>
    <!DOCTYPE hibernate-mapping PUBLIC 
        "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
        "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
    <hibernate-mapping default-lazy="true">
        <class
            name="i2.application.vh.valueobject.Dis"
            table="te_district_dis">
            <cache usage="read-write"/>
            <id name="id" column="dis_id">
                <generator class="native"/>
            </id>        
            <property name="libelle" column="dis_lib"/>
     
            <set name="cei"  inverse="true">
                <key column="dis_id"/>
                <one-to-many class="i2.application.vh.valueobject.Cei"/>
            </set>
     
            <many-to-one name="div" column="div_id" />
        </class>
    </hibernate-mapping>
    Et maintenant j'ai :
    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
     
    <?xml version="1.0" encoding="UTF-8"?>
    <!DOCTYPE hibernate-mapping PUBLIC 
        "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
        "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
    <hibernate-mapping default-lazy="true">
        <class
            name="i2.application.vh.valueobject.Dis"
            table="te_district_dis">
            <cache usage="read-write"/>
            <id name="id" column="dis_id">
                <generator class="native"/>
            </id>        
            <property name="libelle" column="dis_lib"/>
     
            <many-to-one name="div" column="div_id" />
        </class>
    </hibernate-mapping>
    Evidemment, avoir enlevé ce qui déconne m'aide dans ce cas, mais d'autres pages désormais sont en erreur. Voyez-vous une piste explication mon problème de mapping qui fait qu'hibernate tente de modifier (une fois sur deux je rappelle) mon cei et de lui dire qu'il n'appartient plus à un district (dis_id=null)...
    Alexandre Tranchant
    Chef de projet AMO pour le Cerema.
    Retrouvez mes articles sur PHP et Symfony

Discussions similaires

  1. Fermer une fenetre : ça marche une fois sur deux
    Par floanne dans le forum Général JavaScript
    Réponses: 8
    Dernier message: 29/05/2007, 13h27
  2. getElementById qui retourne "" une fois sur deux
    Par Cronycs dans le forum Général JavaScript
    Réponses: 3
    Dernier message: 02/05/2007, 17h33
  3. Carte Wifi s'allume une fois sur deux
    Par czarama dans le forum Réseau
    Réponses: 1
    Dernier message: 23/09/2006, 15h21
  4. le sous formulaire s'affiche une fois sur deux
    Par Math dans le forum Access
    Réponses: 16
    Dernier message: 10/10/2005, 15h25
  5. Pb : malloc qui marche une fois sur deux .... ?
    Par guillaume_pfr dans le forum C
    Réponses: 14
    Dernier message: 21/07/2003, 09h52

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