Qu'est-ce que le contexte de persistance?


109

Je suis nouveau dans le monde Java et JPA. J'étudiais JPA et suis tombé sur de nombreux nouveaux termes comme Entité, persévérance. En lisant, je ne pouvais pas comprendre la définition exacte du contexte de persistance .

Quelqu'un peut-il l'expliquer en termes simples profanes? Quel est le rapport avec les données utilisées dans le @Entity?

Par exemple, je trouve cette définition trop compliquée à comprendre:

Un contexte de persistance est un ensemble d'entités tel que pour toute identité persistante, il existe une instance d'entité unique.

Réponses:


86

Un contexte de persistance gère un ensemble d'entités qui contiennent des données à conserver dans une mémoire de persistance (par exemple une base de données). En particulier, le contexte est conscient des différents états qu'une entité peut avoir (par exemple, géré, détaché) par rapport à la fois au contexte et au magasin de persistance sous-jacent.

Bien que liés à Hibernate (un fournisseur JPA), je pense que ces liens sont utiles:

http://docs.jboss.org/hibernate/core/4.0/devguide/en-US/html/ch03.html

http://docs.jboss.org/hibernate/entitymanager/3.5/reference/en/html/architecture.html

Dans Java EE, un contexte de persistance est normalement accessible via un EntityManager.

http://docs.oracle.com/javaee/6/api/javax/persistence/EntityManager.html

Les différents états qu'une entité peut avoir et les transitions entre ceux-ci sont décrits ci-dessous:

http://docs.jboss.org/hibernate/entitymanager/3.6/reference/en/html/objectstate.html

http://gerrydevstory.com/wp-content/uploads/2012/05/jpa-state-transtition.png


hmmm, c'est logique maintenant. Avez-vous une définition «simple» similaire qui fait la différence entre les gestionnaires d'entités gérés par des conteneurs et gérés par des applications?
Amrit

4
container vs application indique simplement où Entity Manager est créé - à l'extérieur dans un conteneur, ou à l'intérieur, dans l'application.
uiron

66
  1. Les entités sont gérées par l' instance javax.persistence.EntityManager à l' aide du contexte de persistance.
  2. Chaque instance EntityManager est associée à un contexte de persistance .
  3. Dans le contexte de persistance , les instances d'entité et leur cycle de vie sont gérés.
  4. Le contexte de persistance définit une étendue dans laquelle des instances d'entité particulières sont créées, conservées et supprimées.
  5. Un contexte de persistance est comme un cache qui contient un ensemble d' entités persistantes . Ainsi, une fois la transaction terminée , tous les objets persistants sont détachés du contexte de persistance d'EntityManager et ne sont plus gérés.

1
J'ai trouvé qu'EclipseLink ne détache pas les entités une fois la transaction terminée ...
Ray Hulha

Le cache du contexte de persistance gérée par le conteneur ne restera que pendant la durée de la transaction. Les entités lues dans une transaction seront détachées après l'achèvement de la transaction et devront être fusionnées pour être modifiées dans les transactions suivantes. EclipseLink . @RayHulha
pritam kumar

4
@pritamkumar, vous avez bien expliqué le concept de contexte de persistance. J'ajouterais juste qu'il y a aussi l'annotation javax.persistence.PersistenceContext, qui est utilisée pour injecter un objet EntityManager et établir la portée de l'objet injecté (par exemple, une transaction).
Paulo Merson

30

Tiré de cette page:

Voici une feuille de triche rapide du monde JPA:

  • Un cache est une copie de données, copie signifiant tirée mais vivant en dehors de la base de données.
  • Vider un cache consiste à remettre des données modifiées dans la base de données.
  • Un PersistenceContext est essentiellement un cache. Il a également tendance à avoir sa propre connexion de base de données non partagée.
  • Un EntityManager représente un PersistenceContext (et donc un cache)
  • Un EntityManagerFactory crée un EntityManager (et donc un PersistenceContext / Cache)

un PersisnteceContext peut-il avoir des instances EntityManager? Et un Entity Manager peut-il avoir un PersistenceContext? PersisntenceContext est un seul pour toutes les applications?
Roberto

7

UNE contexte persistant représente les entités qui contiennent des données et sont qualifiées pour être persistantes dans un stockage persistant comme une base de données. Une fois que nous avons commitune transaction sous une session à laquelle ces entités sont attachées, Hibernate vide le contexte persistant et les modifications ( insérer / enregistrer, mettre à jour ou supprimer ) sur celles-ci sont conservées dans le stockage persistant.


7

L' org.hibernate.SessionAPI etjavax.persistence.EntityManager API représentent un contexte pour traiter les données persistantes.

Ce concept est appelé un contexte de persistance . Les données persistantes ont un état par rapport à la fois à un contexte de persistance et à la base de données sous-jacente.


5

«Un ensemble d'instances (d'entité) persistantes gérées par une instance de gestionnaire d'entités à un moment donné» est appelé contexte de persistance.

L'annotation JPA @Entity indique une entité persistante.

Reportez-vous à la définition JPA ici


4

En termes simples, nous pouvons dire que Persistence Context est un environnement où les entités sont gérées, c'est-à-dire qu'il synchronise "Entity" avec la base de données.


3

Bien que @pritam kumar donne un bon aperçu, le 5ème point n'est pas vrai.

Le contexte de persistance peut être soit Transaction Scoped - le contexte de persistance «vit» pour la durée de la transaction, soit Extended - le contexte de persistance s'étend sur plusieurs transactions.

https://blogs.oracle.com/carolmcdonald/entry/jpa_caching

EntityManager de JPA et Session d'Hibernate offrent un contexte de persistance étendu.


Salut user2771889, Vous avez raison, je n'ai pas mentionné la portée étendue du contexte de persistance. Le 5ème point était simplement lié au contexte de persistance à portée de transaction.
pritam kumar

2

Le contexte de persistance est un environnement ou un cache dans lequel les instances d'entité (qui sont capables de contenir des données et ayant ainsi la possibilité d'être persistantes dans une base de données) sont gérées par Entity Manager.Il synchronise l'entité avec la base de données.Tous les objets ayant l' annotation @Entity sont capables d'être persisté. @Entity n'est rien d'autre qu'une classe qui nous aide à créer des objets afin de communiquer avec la base de données.Et la façon dont les objets communiquent utilise des méthodes.Et qui fournit ces méthodes, c'est Entity Manager.


1
En quoi cette réponse est-elle différente des réponses existantes?
Akin Okegbile
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.