Quelle est la différence entre le contexte de persistance et le contexte de persistance étendue?

Quelle est la différence entre le contexte de persistance et le contexte de persistance étendue?

La différence est clairement expliquée dans la spécification JSR-220 Enterprise JavaBeans 3.0:

5.6 Contextes de persistance gérés par conteneur

(…)

Un contexte de persistance géré par conteneur peut être défini pour avoir une durée de vie étendue à une transaction unique ou une durée de vie étendue couvrant plusieurs transactions, en fonction du type PersistenceContextType spécifié lors de la création de son EntityManager . Cette spécification fait référence à des contextes de persistance tels que les contextes de persistance et les contextes de persistance étendus, respectivement.

(…)

5.6.1 Contexte de persistance dans les transactions gérées par conteneur

L’application peut obtenir un gestionnaire d’entités gérées par conteneur avec un contexte de persistance de scope de transaction lié à la transaction JTA par injection ou recherche directe dans l’espace de noms JNDI. Le type de contexte de persistance du gestionnaire d’entités est défini par défaut ou défini comme PersistenceContextType.TRANSACTION .

Un nouveau contexte de persistance commence lorsque le gestionnaire d’entités gérées par conteneur est appelé [36] dans le cadre d’une transaction JTA active et qu’aucun contexte de persistance n’est déjà associé à la transaction JTA. Le contexte de persistance est créé, puis associé à la transaction JTA.

Le contexte de persistance se termine lorsque la transaction JTA associée est validée ou annulée et que toutes les entités gérées par EntityManager se détachent.

Si le gestionnaire d’entités est appelé en dehors de la scope d’une transaction, toutes les entités chargées à partir de la firebase database se détacheront immédiatement à la fin de l’appel de méthode.

5.6.2 Contexte de persistance étendue gérée par conteneur

Un contexte de persistance étendue géré par conteneur ne peut être initié que dans le cadre d’un bean session avec état. Il existe à partir du moment où le bean session avec état qui déclare une dépendance sur un gestionnaire d’entités de type PersistenceContextType.EXTENDED est créé et est dit lié au bean session avec état. La dépendance au contexte de persistance étendue est déclarée au moyen de l’annotation PersistenceContext ou de l’élément de déploiement persistence-context-ref.

Le contexte de persistance est fermé par le conteneur lorsque la méthode @Remove du bean session avec état est terminée (ou l’instance du bean session avec état est détruite d’une autre manière).

(…)

Il y a beaucoup de détails à respecter … mais pour restr bref, je me souviens de la différence comme ceci:

Contexte de la persistance des transactions

En bref: lorsqu’une méthode sur un bean à scope de transaction est appelée, une transaction sera automatiquement lancée par le conteneur et un nouveau contexte de persistance sera créé pour vous. Lorsque la méthode se termine, les transactions se terminent et le contexte de persistance sera fermé, vos entités se détacheront.

Avantage: Ce comportement est sans état, ne nécessite pas beaucoup de maintenance dans le code et rend votre thread de sécurité EntityManager.

Contexte de persistance étendue

En bref: Peut être utilisé pour un bean session avec état uniquement et est lié au cycle de vie du bean. Le contexte de persistance peut apparaître sur plusieurs transactions, ce qui signifie que les méthodes de votre bean étendu partagent le même contexte de persistance.

Avantage: Parfait pour mettre en œuvre une interaction de style conversation avec les clients. Votre client appelle plusieurs méthodes de haricot pour informer votre bean de toutes les informations dont vous avez besoin et à la fin de la conversation, vous persistez dans votre firebase database.

Des choses importantes à savoir

Propagation de la transaction: en supposant que TransactionAtsortingbutes par défaut pour un bean à scope de transaction avec deux méthodes A et B.

Si la méthode B est appelée à l’intérieur de la méthode A, vous pouvez propager le contexte de persistance de A à B. Ainsi, la méthode B peut accéder aux entités non encore créées qui ont été créées / modifiées par A, car elles sont toujours gérées par B a maintenant access à.

Propagation de la transaction étendue à scope de transaction : vous pouvez propager le contexte de persistance d’un bean étendu à un bean à scope de transaction en appelant une méthode de votre bean à scope de transaction à partir de votre bean étendu. Avec l’atsortingbut de transaction par défaut ( REQUIRED ), votre bean à scope de transaction réutilisera le contexte de persistance actif existant de votre bean étendu.

Propagation des transactions de scope étendue à une extension : l’ inverse n’est cependant pas aussi intuitif, car un contexte de persistance étendu essaie toujours de devenir le contexte de persistance actif. Vous devez modifier l’atsortingbut de transaction par défaut pour le bean étendu en utilisant @TransactionAtsortingbute(TransactionAtsortingbuteType.REQUIRES_NEW) . Cela suspend toute transaction active (associée à un contexte de persistance) avant le démarrage de la méthode du bean étendu.

Contexte de persistance de la transaction

Comme son nom l’indique, un contexte de persistance axé sur les transactions est lié au cycle de vie de la transaction. Il est créé par le conteneur pendant une transaction et sera fermé à la fin de la transaction.

Les gestionnaires d’entités à scope de transaction sont responsables de la création automatique de contextes de persistance à scope de transaction lorsque cela est nécessaire. Nous ne disons que lorsque cela est nécessaire, car la création du contexte de persistance des transactions est paresseuse.

Un gestionnaire d’entités crée un contexte de persistance uniquement lorsqu’une méthode est appelée sur le gestionnaire d’entités et qu’il n’y a pas de contexte de persistance disponible.

Contextes de persistance étendue

Le cycle de vie d’un contexte de persistance étendue est lié au bean session avec état auquel il est lié.

Contrairement à un gestionnaire d’entités à scope de transaction qui crée un nouveau contexte de persistance pour chaque transaction, le gestionnaire d’entités étendues d’un bean de session avec état utilise toujours le même contexte de persistance.

Le bean session avec état est associé à un seul contexte de persistance étendue créé lorsque l’instance du bean est créée et fermée lorsque l’instance du bean est supprimée. Cela a des implications à la fois pour les caractéristiques d’association et de propagation du contexte de persistance étendue.