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

JPA Java Discussion :

Gestion des transactions : Définir le mode programatique sur une méthode


Sujet :

JPA Java

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Avril 2010
    Messages
    65
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Avril 2010
    Messages : 65
    Points : 53
    Points
    53
    Par défaut Gestion des transactions : Définir le mode programatique sur une méthode
    Bonjour,

    Au niveau d'un session bean (stateless) qui fonctionne correctement en mode managé j'ai besoins de gérer manuellement ma transaction pour la méthode supprimerLocalite.

    L'objectif est de pouvoir catcher une ConstraintViolationException dans la couche métier, c'est en recherchant dans ce forum des problèmes semblables au mien que j'ai compris que les exceptions lancées lors du comit() ne peuvent pas être attrapées dans la méthode puisqu'elles sont lancées à la fin (en mode managé).

    Voici le 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
    @Stateless
    @Remote(ConfigurationBeanRemote.class)
    public class ConfigurationBean implements ConfigurationBeanRemote {
     
      @PersistenceContext(unitName = "adressesEJB", type=PersistenceContextType.TRANSACTION)
      EntityManager em;
     
      public ConfigurationBean() {
      }
     
      @Override
      public void modifierLocalite(Localite cetteLocalite) throws InternalErrorException {
     
      try {
        em.merge(cetteLocalite);
      } catch (Exception e) {
        e.printStackTrace();
        throw new InternalErrorException("Erreur lors de modification de cette localité");
      }
    }
     
      @TransactionManagement(TransactionManagementType.BEAN)
      public void effacerLocalite(Localite cetteLocalite) throws InternalErrorException {
     
      try {
        em.remove(em.merge(cetteLocalite));
      } catch (ConstraintViolationException e1) {
        e1.printStackTrace();
        throw new InternalErrorException("Cette localité ne peut pas être supprimée");
      } catch (Exception e) {
        e.printStackTrace();
        throw new InternalErrorException("Erreur lors de suppression de cette localité");
      }
     
    }
    Je précise que du coup je n'ai pas placé les méthodes begin(), joinTransaction() et commit() autour de la suppression

    Quand j'utilise, sur la méthode supprimerLocalite l'annotation :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    @TransactionManagement(TransactionManagementType.BEAN)
    mon parseur me dit (The annotation @TransactionManagement is disallowed for this location) qu'elle ne peut pas être utilisée à cet endroit et pourtant j'ai lu le contraire.

    Voilà j'ai besoins de votre aide à nouveau.

  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 141
    Points
    4 141
    Par défaut
    D'après la javadoc :
    Specifies whether a session bean or message driven bean has container managed transactions or bean managed transactions. If this annotation is not used, the bean is assumed to have container-managed transaction management.
    Donc on ne peut pas mélanger les deux types de gestion au sein du même bean.

  3. #3
    Membre du Club
    Profil pro
    Inscrit en
    Avril 2010
    Messages
    65
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Avril 2010
    Messages : 65
    Points : 53
    Points
    53
    Par défaut
    Ok, merci pour ta réponse

    Voici le code qui fonctionne chez moi maintenant :
    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
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    @Stateless
    @Remote(ConfigurationBeanRemote.class)
    @TransactionManagement(javax.ejb.TransactionManagementType.BEAN)
    public class ConfigurationBean implements ConfigurationBeanRemote, Serializable {
     
      private static final long serialVersionUID = 1L;
      private static final Logger log = Logger.getLogger(ConfigurationBean.class);
     
        @Resource
        private UserTransaction userTx;
     
        private EntityManagerFactory emFactory;
        private EntityManager em;
     
        public ConfigurationBean() {
        }
     
      (...)
     
      @Override
      public void effacerLocalite(Localite cetteLocalite) throws InternalErrorException {
     
      emFactory = Persistence.createEntityManagerFactory("adressesEJB");
      em = emFactory.createEntityManager();
     
      try {
        userTx.begin();
        em.joinTransaction();
        em.remove(em.merge(cetteLocalite));
        userTx.commit();
      } catch (NotSupportedException e1) {
        e1.printStackTrace();
        throw new InternalErrorException("Erreur lors de suppression de cette localité");
      } catch (SystemException e2) {
        e2.printStackTrace();
        throw new InternalErrorException("Erreur lors de suppression de cette localité");
      } catch (SecurityException e3) {
        e3.printStackTrace();
        throw new InternalErrorException("Erreur lors de suppression de cette localité");
      } catch (IllegalStateException e4) {
        e4.printStackTrace();
        throw new InternalErrorException("Erreur lors de suppression de cette localité");
      } catch (RollbackException e5) {
        e5.printStackTrace();
        throw new InternalErrorException("Cette localité ne peut pas être supprimée");
      } catch (HeuristicMixedException e6) {
        e6.printStackTrace();
        throw new InternalErrorException("Cette localité ne peut pas être supprimée");
      } catch (HeuristicRollbackException e7) {
        e7.printStackTrace();
        throw new InternalErrorException("Cette localité ne peut pas être supprimée");
      } catch (Exception e) {
        e.printStackTrace();
        throw new InternalErrorException("Erreur lors de suppression de cette localité");
      }
     
    }
     
    }

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

Discussions similaires

  1. Gestion des transactions avec les composants DOA
    Par lper dans le forum Bases de données
    Réponses: 2
    Dernier message: 01/12/2008, 16h06
  2. [Data] Gestion des transactions
    Par hlr dans le forum Spring
    Réponses: 2
    Dernier message: 21/02/2006, 09h47
  3. Gestion des évènements lors d'un clique sur une image.
    Par yoghisan dans le forum Débuter
    Réponses: 7
    Dernier message: 23/06/2005, 19h04
  4. Gestion des transactions - Gestion des erreurs
    Par devdev dans le forum MS SQL Server
    Réponses: 14
    Dernier message: 23/03/2005, 20h17
  5. gestion des transactions
    Par viny dans le forum Requêtes
    Réponses: 2
    Dernier message: 26/03/2004, 21h53

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