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

Persistance des données Java Discussion :

Rollback dans une methode d'un backedbean


Sujet :

Persistance des données Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre très actif
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Janvier 2007
    Messages
    187
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Janvier 2007
    Messages : 187
    Par défaut Rollback dans une methode d'un backedbean
    Voila je cherche à réaliser des opérations en base de donnée dans un backedbean au moyen d'une BMT. Je tombe alors sur un pb étrange. Lorsque je tente d'enregistrer un bean EJB Entity depuis une méthode de mon backedbean JSF et bien selon la provenance des exceptions le rollback est possible où pas.

    Je m'explique, si l'enregistrement de reportAuthor provoque une constrain violation au niveau de la base de donnée (noms identiques par ex) et bien l'appel au rollback provoque lui même une exception (de type No Transaction) et lorsque cela se produit on a:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    tx.getStatus() = Status.STATUS_NO_TRANSACTION
    alors que si à la place une exception provenait non pas de la base de donnée mais du code directement et bien on aurait:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    tx.getStatus() = Status.STATUS_ACTIVE
    et dans ce dernier cas de figure le rollback fonctionne et fait son oeuvre.

    Des idées ?

    Voici un extrait du 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
    public String doSave() throws Exception {
     try {
      tx.begin();
     
      ReportAuthor reportAuthor = new ReportAuthor();
      reportAuthor.setFirstname(firstname);
      reportAuthor.setLastname(lastname);
     
      em.persist(reportAuthor);			
      tx.commit();
     } catch (Exception e) {	
      try {					
       tx.rollback();
      } catch (Exception e1) {
       throw e1;
      }
     }
    }
    L'objet transaction est injecté au moyen de l'annotation suivante:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    @Resource
    UserTransaction tx;

  2. #2
    Membre très actif
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Janvier 2007
    Messages
    187
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Janvier 2007
    Messages : 187
    Par défaut
    Le code a été testé sous JBoss puis sous Glassfish 3, dans les deux cas le résultat est le même. Le rollback est initié par le serveur dans le cas d'une exception (constrain violation or duplicate key) remontée par la base de donnée (driver jdbc) et c'est apparemment le comportement convenu donc il faut penser à rajouter dans son code le test suivant sous peine de voir s'immiscer sur la page JSF une exception "No transacton" (pour JBoss) ou "Transaction not active" (pour Glassfish 3):

    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
     
    public String doSave() throws Exception {
     try {
      tx.begin();
     
      ReportAuthor reportAuthor = new ReportAuthor();
      reportAuthor.setFirstname(firstname);
      reportAuthor.setLastname(lastname);
     
      em.persist(reportAuthor);			
      tx.commit();
     } catch (Exception e) {
     
      if (tx.getStatus() == Status.STATUS_ACTIVE) {	
        try {					
          tx.rollback();
        } catch (Exception e1) {
          throw e1;
        }
      }
     }
    }

Discussions similaires

  1. Ajouter un DLL comme parametre dans une method
    Par charaf dans le forum VB.NET
    Réponses: 2
    Dernier message: 17/09/2007, 09h36
  2. Réponses: 2
    Dernier message: 02/05/2006, 14h34
  3. execution de blt dans une methode de classe
    Par micflor dans le forum DirectX
    Réponses: 2
    Dernier message: 13/03/2006, 20h31
  4. Réponses: 9
    Dernier message: 19/10/2005, 04h35
  5. [MFC] Passage d'une structure dans une method
    Par KPitN dans le forum MFC
    Réponses: 5
    Dernier message: 18/06/2004, 10h11

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