Cos'è il contesto di persistenza?


109

Sono nuovo nel mondo Java e JPA. Stavo studiando JPA e mi sono imbattuto in molti nuovi termini come Entità, persistenza. Durante la lettura, non sono riuscito a capire la definizione esatta di Contesto di persistenza .

Qualcuno può spiegarlo in termini semplici laici? Cosa ha a che fare con i dati utilizzati nel @Entity?

Ad esempio, trovo questa definizione troppo complicata da capire:

Un contesto di persistenza è un insieme di entità tali che per ogni identità persistente esiste un'istanza di entità univoca.

Risposte:


86

Un contesto di persistenza gestisce un insieme di entità che contengono dati da persistere in un archivio di persistenza (ad esempio un database). In particolare, il contesto è consapevole dei diversi stati che un'entità può avere (ad esempio gestita, scollegata) in relazione sia al contesto che alla memoria di persistenza sottostante.

Sebbene sia correlato a Hibernate (un fornitore di JPA), penso che questi collegamenti siano utili:

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

In Java EE, si accede normalmente a un contesto di persistenza tramite EntityManager.

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

I vari stati che un'entità può avere e le transizioni tra questi sono descritti di seguito:

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, ora ha senso. Hai una definizione "Semplice" simile che indica la differenza tra Entity Manager gestiti dal contenitore e gestiti dall'applicazione?
Amrit

4
container vs application dice semplicemente dove viene creato Entity Manager: all'esterno in un contenitore o all'interno dell'applicazione.
uiron

66
  1. Le entità sono gestite da javax.persistence.EntityManager esempio utilizzando contesto di persistenza.
  2. Ogni istanza di EntityManager è associata a un contesto di persistenza .
  3. All'interno del contesto di persistenza , vengono gestite le istanze dell'entità e il relativo ciclo di vita.
  4. Il contesto di persistenza definisce un ambito in cui vengono create, mantenute e rimosse particolari istanze di entità.
  5. Un contesto di persistenza è come una cache che contiene un insieme di entità persistenti , quindi una volta terminata la transazione , tutti gli oggetti persistenti vengono scollegati dal contesto di persistenza di EntityManager e non vengono più gestiti.

1
Ho scoperto che EclipseLink non scollega le entità dopo che una transazione è terminata ...
Ray Hulha

La cache del contesto di persistenza gestita dal contenitore rimarrà solo per la durata della transazione. Le entità lette in una transazione verranno scollegate dopo il completamento della transazione e dovranno essere unite per essere modificate nelle transazioni successive. EclipseLink . @RayHulha
pritam kumar

4
@pritamkumar, hai spiegato bene il concetto di contesto di persistenza. Aggiungerei solo che c'è anche l'annotazione javax.persistence.PersistenceContext, che viene utilizzata per iniettare un oggetto EntityManager e stabilire l'ambito dell'oggetto iniettato (ad esempio, una transazione).
Paulo Merson

30

Tratto da questa pagina:

Ecco un breve cheat sheet del mondo JPA:

  • Una cache è una copia dei dati, il significato della copia è stato estratto ma che vive al di fuori del database.
  • Lo svuotamento di una cache è l'atto di reinserire i dati modificati nel database.
  • Un PersistenceContext è essenzialmente una cache. Inoltre, tende ad avere una propria connessione al database non condivisa.
  • Un EntityManager rappresenta un PersistenceContext (e quindi una cache)
  • Un EntityManagerFactory crea un EntityManager (e quindi un PersistenceContext / Cache)

un PersisnteceContext può avere istanze di EntityManager? E un Entity Manager può avere PersistenceContext? PersisntenceContext è solo uno per tutte le applicazioni?
Roberto

7

Un contesto persistente rappresenta le entità che contengono dati e sono qualificate per essere persistenti in una memoria persistente come un database. Una volta eseguita commituna transazione in una sessione a cui sono collegate queste entità, Hibernate svuota il contesto persistente e le modifiche ( inserimento / salvataggio, aggiornamento o eliminazione ) su di esse vengono mantenute nella memoria persistente.


7

Sia l' org.hibernate.SessionAPI che l' javax.persistence.EntityManagerAPI rappresentano un contesto per gestire i dati persistenti.

Questo concetto è chiamato contesto di persistenza . I dati persistenti hanno uno stato in relazione sia al contesto di persistenza che al database sottostante.


5

"Un insieme di istanze persistenti (entità) gestite da un'istanza del gestore entità in un dato momento" è chiamato contesto di persistenza.

L'annotazione JPA @Entity indica un'entità persistente.

Fare riferimento alla definizione JPA qui


4

In parole povere possiamo dire che Persistence Context è un ambiente in cui le entità vengono gestite, cioè sincronizza "Entity" con il database.


3

Mentre @pritam kumar fornisce una buona panoramica, il quinto punto non è vero.

Il contesto di persistenza può essere Transaction Scoped - il Contesto di persistenza "vive" per la durata della transazione o Esteso - il Contesto di persistenza si estende su più transazioni.

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

EntityManager di JPA e Session di Hibernate offrono un contesto di persistenza esteso.


Ciao user2771889, Hai ragione, non ho menzionato l'ambito esteso del contesto di persistenza. Il quinto punto era solo correlato al contesto di persistenza nell'ambito della transazione.
pritam kumar

2

Il contesto di persistenza è un ambiente o cache in cui le istanze di entità (che sono in grado di contenere dati e quindi avere la possibilità di essere persistenti in un database) sono gestite da Entity Manager .Sincronizza l'entità con il database.Tutti gli oggetti con annotazione @Entity sono in grado di essere persistito. @Entity non è altro che una classe che ci aiuta a creare oggetti per comunicare con il database. E il modo in cui gli oggetti comunicano è usare metodi. E chi fornisce questi metodi è l'Entity Manager.


1
In che modo questa risposta è diversa dalle risposte esistenti?
Akin Okegbile
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.