JPA (Java Persistence API)

Data Persistence è un mezzo per un'applicazione per persistere e richiamare le informazioni da un sistema di archiviazione non volatile. JPA (Java™ Persistence API) fornisce un meccanismo per gestire la persistenza e la mappatura e le funzioni relazionali ad oggetto a partire dalle specifiche EJB 3.0 .

Open Liberty Per informazioni sull'utilizzo di JPA 2.1 e successive con Liberty, consultare il sito Web Open Liberty.

La persistenza è vitale per le applicazioni enterprise a causa dell'accesso richiesto ai database relazionali. Le applicazioni sviluppate per questo ambiente devono gestire la persistenza stessa o utilizzare soluzioni di terze parti per gestire gli aggiornamenti del database e il richiamo con persistenza.

La specifica JPA definisce internamente la mappatura oggetto - relazionale, piuttosto che relazionarsi sulle implementazioni di mappatura specifiche del fornitore. JPA è basato sul modello di programmazione Java che si applica agli ambienti Java Enterprise Edition (Java EE), ma JPA può funzionare in un ambiente Java SE per il test delle funzioni dell'applicazione.

JPA rappresenta una semplificazione del modello di programmazione di persistenza. La specifica JPA definisce esplicitamente la mappatura oggetto - relazionale, piuttosto che affidarsi alle implementazioni di mappatura specifiche del fornitore. JPA standardizza l'importante attività di mappatura oggetto - relazionale utilizzando annotazioni o XML per associare gli oggetti in una o più tabelle di un database. Per semplificare ulteriormente il modello di programmazione di persistenza:

  • L'API EntityManager può conservare, aggiornare, richiamare o rimuovere oggetti da un database.
  • L'API EntityManager e i metadati dell'associazione relazionale ad oggetti gestiscono la maggior parte delle operazioni del database senza richiedere la scrittura di codice JDBC o SQL per mantenere la persistenza.
  • JPA fornisce un linguaggio di query, estendendo il linguaggio di querying EJB indipendente (noto anche come JPQL), che è possibile utilizzare per richiamare gli oggetti senza scrivere query SQL specifiche per il database con cui si sta lavorando.

JPA è progettato per operare all'interno e all'esterno di un contenitore Java Enterprise Edition (Java EE). Quando si esegue JPA all'interno di un contenitore, le applicazioni possono utilizzare il contenitore per gestire il contesto di persistenza. Se non esiste un contenitore per gestire JPA, l'applicazione deve gestire la gestione del contesto di persistenza stessa. Le applicazioni progettate per la persistenza gestita da contenitore non richiedono altrettanta implementazione di codice per gestire la persistenza, ma queste applicazioni non possono essere utilizzate al di fuori di un contenitore. Le applicazioni che gestiscono la propria persistenza possono funzionare in un ambiente contenitore o in un ambiente Java SE.

I contenitori Java EE che supportano il modello di programmazione EJB 3.x devono supportare un'implementazione JPA, denominata anche provider di persistenza. Un provider di persistenza JPA utilizza i seguenti elementi per abilitare una gestione di persistenza più semplice in un ambiente EJB 3.x :

Unità di persistenza
Definisce un oggetto completo di mappatura delle classi Java (entità + strutture di supporto) con un database relazionale. EntityManagerFactory utilizza questi dati per creare un contesto di persistenza a cui si può accedere tramite EntityManager.
EntityManagerFactory
Utilizzato per creare un EntityManager per le interazioni del database. I container dell'application server forniscono in genere questa funzione, ma EntityManagerFactory è necessario se si utilizza la persistenza gestita dall'applicazione JPA. Un'istanza di EntityManagerFactory rappresenta un contesto di persistenza.
Contesto di persistenza
Definisce la serie di istanze attive che l'applicazione sta manipolando attualmente. È possibile creare il contesto di persistenza manualmente o attraverso l'iniezione.
EntityManager
Il gestore delle risorse che mantiene la raccolta attiva degli oggetti di entità che vengono utilizzati dall'applicazione. EntityManager gestisce l'interazione del database e i metadati per le associazioni oggetto - relazionale. Un'istanza di EntityManager rappresenta un contesto di persistenza. Un'applicazione in un contenitore può ottenere EntityManager mediante l'inserimento nell'applicazione o ricercandolo nello spazio dei nomi del componente Java. Se l'applicazione gestisce la propria persistenza, EntityManager è ottenuto da EntityManagerFactory.
Oggetti di entità
Una semplice classe Java che rappresenta una riga in una tabella di database nella sua forma più semplice. Gli oggetti di entità possono essere classi di cemento o classi astratte. Mantengono gli stati utilizzando proprietà o campi.

Java Persistence API e Contenuti di transazione locale

WebSphere fornisce contesti di transazioni locali e globali ai componenti gestiti. Fornendo questi contesti ai componenti gestiti e avendo thread per il servizio dei componenti gestiti, una transazione è sempre attiva se per un contesto di transazione globale (GTC) o un contesto di transazione locale (LTC).

Questa elaborazione non ha effetto sui contesti di persistenza gestiti dall'applicazione, ovvero JPA EntityManagers acquisiti tramite EntityManagerFactories iniettati in un'applicazione con @PersistenceUnit. Ma questa elaborazione può influire sui Container-Managed Persistence Contexts (CMTS), cioè JPA EntityManagers iniettato attraverso @PersistenceContext. I metodi dell'API JPA richiedono che venga lanciata un'eccezione TransactionRequiredException quando vengono chiamati al di fuori dei confini di un GTC e questa eccezione viene comunque lanciata come previsto. Tuttavia, mentre il LTC rimane attivo e fino a quando non viene avviato un nuovo GTC o si raggiunge la fine dell'invocazione del servizio componente, il contesto di persistenza CMTS rimane attivo. Le entità che vengono recuperate utilizzando una ricerca o una query da un EntityManager CMTS entro i limiti di un LTC sono ancora gestite da tale contesto di persistenza, invece di essere immediatamente scollegate. A seguito di questa elaborazione, che può sembrare un comportamento inaspettato e la differenza di comportamento con alcune guide di programmazione JPA, il contesto di persistenza tenuto in vita dal LTC viene smaltire una volta che inizia il GTC, e gli enti gestiti da quel contesto di persistenza diventano staccati.