8. Transaction gérée par le serveur

8.1. Introduction

Dans ce cas, les transactions ne sont pas gérées manuellement mais par le serveur. Il n'est pas légal d'injecter la transaction dans l'EJB comme dans le cas précédent. On peut toutefois contrôler le contexte transactionnel par annotations, comme nous allons le voir.

8.2. Déclaration du mode transactionnel

Le mode transactionnel se déclare de la même façon, en changeant la valeur de l'attribut passé à l'annotation @TransactionManagement.

Exemple 71. Annotation sur un EJB en mode container managed transaction

@Stateless(mappedName="MarinService")
 @Remote(MarinService.class)
 @TransactionManagement(TransactionManagementType.CONTAINER)
 public  class MarinServiceImpl  implements MarinService {

     // reste de la classe
}

Notons que ce mode est le mode par défaut, cette annotation est donc optionnelle.

8.3. Gestion de la transaction

Dans ce mode, le fait d'entrer dans une méthode métier démarre automatiquement une transaction. C'est en tout cas le comportement par défaut. On peut modifier ce comportement en annotant chaque méthode métier individuellement, ou la classe de l'EJB, auquel cas toutes les méthodes métier partageront le même comportement. L'annotation qui permet de gérer ce comportement est @TransactionAttribute. Elle ne prend qu'un seul attribut, de type TransactionAttributeType. Cette énumération peut prendre les valeurs suivantes : MANDATORY, NEVER, NOT_SUPPORTED, REQUIRED, REQUIRES_NEW et SUPPORTS. Annoter une méthode de cette façon a trois conséquences.
  • Cela indique au serveur d'application ce qu'il doit faire : créer une nouvelle transaction ou pas, récupérer une transaction existante, etc...
  • Cela indique le comportement que le serveur doit avoir lorsqu'une méthode d'un EJB est invoquée par un client qui se trouve déjà dans un contexte transactionnel, comme une méthode d'un autre EJB par exemple.
  • Cela indique enfin la valeur de la transaction que le resource manager va avoir en référence.
Résumons ces différents comportements dans le tableau suivant. Dans ce tableau, T1 représente la transaction dans laquelle se trouve le client, si elle existe. T2 représente une nouvelle transaction, créée par le serveur d'application pour l'exécution de la méthode métier appelée.

Tableau 1. Valeurs de l'attribut de @TransactionAttribute

Valeur de l'attribut Transaction dans laquelle se trouve le client Transaction dans laquelle se trouve la méthode métier Transaction enregistrée auprès du resource manager
NOT_SUPPORTED pas de transaction aucune null
NOT_SUPPORTED T1 aucune null
REQUIRED pas de transaction T2 T2
REQUIRED T1 T1 T1
SUPPORTS pas de transaction aucune null
SUPPORTS T1 T1 T1
REQUIRES_NEW pas de transaction T2 T2
REQUIRES_NEW T1 T2 T2
MANDATORY pas de transaction ERREUR -
MANDATORY T1 T1 T1
NEVER pas de transaction aucune null
NEVER T1 ERREUR -

8.4. Fonctionnement de la transaction

Il n'y a rien besoin de faire pour gérer la transaction dans ce cas. Toutes les étapes du cycle de vie de cette transaction sont gérées par le serveur d'application.

8.5. Remarques

L'utilisation de ces annotations peut permettre d'exécuter du code entièrement non transactionnel dans un EJB. Cela peut mener à des améliorations de performances notables.
JPA & EJB
Retour au blog Java le soir
Cours & Tutoriaux
Table des matières
Introduction
1. Objet du mapping objet / relationnel
2. Un peu d'histoire
Un premier exemple
1. Introduction
2. Création de l'environnement technique
2.1. Introduction
2.2. Création de la base Derby
2.3. Création du projet NetBeans et d'une première entité
2.4. Structure d'un projet persistant
2.5. Une première classe persistante
2.6. Un premier fichier persistence.xml
3. Utilisation de ce premier exemple
3.1. Écriture du code d'utilisation
3.2. Exécution de notre premier exemple
3.3. Modification de la class Marin
3.4. Opérations CRUD
Mettre un jeu de classes en base
1. Introduction
2. Définition d'une entité JPA
2.1. Écriture de l'entité
2.2. Annotation de l'entité
2.3. Annotations des champs
2.4. Exemple d'utilisation
3. Opérations sur les entités
3.1. Introduction
3.2. Opération PERSIST
3.3. Opération REMOVE
3.4. Opération REFRESH
3.5. Opération DETACH
3.6. Opération MERGE
4. Mise en relation d'entités
4.1. Introduction
4.2. Relations unidirectionnelles et bidirectionnelles
4.3. Relation 1:1
4.4. Relation 1:p
4.5. Relation p:1
4.6. Relation n:p
4.7. Comportement cascade
4.8. Effacement des entités orphelines
5. Charger des entités et leurs relations
6. Objets inclus
6.1. Introduction
6.2. Déclaration d'un objet inclus
6.3. Utilisation d'objets inclus
6.4. Cas où l'objet inclus est nul
6.5. Renommer les colonnes incluses
6.6. Collections d'objets inclus
L'API Collection en base
1. Introduction
2. Enregistrer une collection d'entités
2.1. Enregistrement d'une collection simple
2.2. Enregistrement d'un Set
2.3. Enregistrement d'une List
3. Enregistrer une collection de types de base
4. Enregistrement d'une Map
4.1. Table de hachage de type (type de base, entité)
4.2. Cas où la clé est un champ de la valeur
4.3. Cas d'une table (entité, entité)
Héritage
1. Introduction
2. Enregistrement d'une hiérarchie de classes
2.1. Entité et super-classe non enregistrée
2.2. Position du problème
2.3. Trois façons de faire
3. Stratégie SINGLE_TABLE
3.1. Fonctionnement
3.2. Mise en place
3.3. Limitations
4. Stratégie JOINED
4.1. Fonctionnement
4.2. Mise en place
4.3. Limitations
5. Stratégie TABLE_PER_CLASS
5.1. Fonctionnement
5.2. Mise en place
5.3. Limitations
Requêtes
1. Introduction
2. Un premier exemple
2.1. Écriture d'une première requête
2.2. Exécution d'une première requête
2.3. Exécution d'une première requête d'agrégation
3. Définition de requêtes
3.1. Requêtes dynamiques
3.2. Requêtes paramétrées
3.3. Requêtes nommées
3.4. Requêtes natives
4. Exécution, analyse du résultat
4.1. Exécution d'une requête dynamique
4.2. Exécution d'une requête nommée
4.3. Analyse du résultat
4.4. Cas des résultats de grande taille
4.5. Remarques
5. Clause From
5.1. Définition des entités
5.2. Jointures dans la clause From
5.3. Remarque finale sur les jointures en JPQL
6. Clause Where
6.1. Variables et chemins dans une clause where
6.2. Expressions conditionnelles et opérateurs
6.3. Requêtes imbriquées
6.4. Opérateurs any, all et some
6.5. Expressions fonctionnelles
7. Clauses Group By et Having
8. Opérations Update et Delete
EJB
1. Introduction
2. Un premier exemple
2.1. Introduction
2.2. Installation dans Glassfish à l'aide de Netbeans
2.3. Création d'un premier EJB
2.4. Déploiement de notre premier EJB
2.5. Création d'un client
3. Mise en oeuvre du pattern session facade
3.1. Introduction
3.2. Modèle objet
3.3. Définition de l'unité de persistance
3.4. Assemblage de notre application
3.5. Assemblage et déploiement
3.6. Utilisation du client
4. Opération de persistance en façade
4.1. Introduction
4.2. Enrichissement du service
4.3. Création de la méthode findMarinById(long)
4.4. Ajout de la méthode findAllMarins()
4.5. Utilisation dans un code client
5. Types d'EJB
5.1. Introduction
5.2. Qu'est-ce qu'un EJB ?
5.3. Écriture d'un EJB session
5.4. Qu'est-ce qu'une méthode métier ?
5.5. EJB avec ou sans état
5.6. Gestion des transactions
5.7. Restrictions
6. Cycle de vie d'un EJB
6.1. Cas des EJB sans état
6.2. Cas des EJB avec état
6.3. Injection de dépendances
7. Transaction gérée par l'EJB
7.1. Introduction
7.2. Déclaration du mode transactionnel
7.3. Gestion de la transaction
7.4. Fonctionnement de la transaction
7.5. Cas des EJB avec état
8. Transaction gérée par le serveur
8.1. Introduction
8.2. Déclaration du mode transactionnel
8.3. Gestion de la transaction
8.4. Fonctionnement de la transaction
8.5. Remarques
9. Intercepteurs
9.1. Introduction
9.2. Aperçu général
9.3. Cycle de vie d'un intercepteur
9.4. Object InvocationContext
9.5. Interception d'un EJB ou d'une méthode métier
9.6. Exemple de mise en œuvre d'un intercepteur