Java Persistence API (JPA)
Data Persistence è un mezzo per un'applicazione per persistere e richiamare le informazioni da un sistema di archiviazione non volatile. L'API Java™ Persistence (JPA) fornisce un meccanismo per la gestione della persistenza e della mappatura oggetto-relazionale ed è in uso sin dalle specifiche EJB 3.0.
Per informazioni sull'utilizzo di JPA 2.1 e versioni 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 si basa sul modello di programmazione Java applicabile agli ambienti Java Enterprise Edition ( Java EE ), ma può funzionare anche in un ambiente Java SE per testare le funzionalità delle applicazioni.
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 funzionare sia all’interno che all’esterno di un container Java EE ( Enterprise Edition ). 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 autonomamente la propria persistenza possono funzionare in un ambiente container o in un ambiente Java SE.
I container Java EE che supportano il modello di programmazione EJB " 3.x " devono supportare un'implementazione JPA, detta 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 modello oggetto-relazionale completo che mappa le classi Java (entità + strutture di supporto) con un database relazionale. L' EntityManagerFactory e utilizza questi dati per creare un contesto di persistenza a cui è possibile accedere tramite l' 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. L' EntityManager e gestisce l'interazione con il database e i metadati relativi alle mappature oggetto-relazionali. Un'istanza di un oggetto ` EntityManager ` rappresenta un contesto di persistenza. Un'applicazione in un container può ottenere l'oggetto ` EntityManager ` tramite iniezione nell'applicazione oppure cercandolo nello spazio dei nomi dei componenti Java. Se l'applicazione gestisce autonomamente la propria persistenza, l' EntityManager viene ottenuto dall' EntityManagerFactory.
- Oggetti di entità
- Una semplice classe Java che rappresenta una riga di 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.