Applicazioni JPA e OSGi

È possibile utilizzare JPA (Java™ Persistence API) in OSGi Applications in modo simile a JPA in applicazioni Java EE . Questo argomento descrive le differenze quando si utilizza JPA con bundle di persistenza in una applicazione OSGi.

Le applicazioni OSGi utilizzano i bundle di persistenza per definire le entità e i servizi che possono essere utilizzati da altri bundle o dallo stesso bundle di persistenza.

Un bundle di persistenza è un bundle OSGi che contiene uno o più descrittori di persistenza (filepersistence.xml ) e ha un'intestazione Meta - Persistence nel manifest del bundle, META-INF/MANIFEST.MF. Questa intestazione elenca tutte i percorsi dei file persistence.xml nel bundle di persistenza. Quando questa intestazione è presente, l'ubicazione predefinita, META-INF/persistence.xml, viene aggiunta per default. Di conseguenza, quando i file persistence.xml si trovano nell'ubicazione predefinita, l'intestazione Meta - Persistence deve essere presente, ma il suo contenuto può essere vuoto (un singolo spazio).

Il seguente esempio di intestazione Meta - Persistence definisce un bundle di persistenza con due descrittori di persistenza, una in entities e una nel jar nidificato lib/thirdPartyEntities.jar. Possono essere utilizzati anche tutti i file persistence.xml che si trovano nell'ubicazione predefinita.

Meta-Persistence: entities/persistence.xml, 
lib/thirdPartyEntities.jar!/META-INF/persistence.xml

Il supporto JPA per le applicazioni OSGi può essere gestito dal contenitore o dall'applicazione. JPA non gestito non è supportato per le applicazioni OSGi.

È possibile utilizzare JPA nei bundle dell'applicazione Web (WAB) nello stesso modo in cui si utilizza JPA negli archivi dell'applicazione Web (file WAR), purché tutta la logica di persistenza sia contenuta nell'applicazione Web.

Per ulteriori informazioni, consultare le seguenti sezioni e l'argomento correlato sullo sviluppo di applicazioni che utilizzano JPA.

Descrittori persistenza

Nei file persistence.xml per un'applicazione OSGi, gli elementi jta - data - source e non - jta - data - source accedono alle origini dati tramite una ricerca JNDI (Java Naming and Directory Interface), una ricerca JNDI al registro del servizio o tramite Blueprint. Questo comportamento è al posto delle ricerche JNDI (Java Naming and Directory Interface) utilizzate nelle applicazioni Java EE . I seguenti esempi mostrano la sintassi per un elemento jta - data - source:

<jta-data-source>
   jndi_name_of_the_data_source
</jta-data-source>
<jta-data-source>
   osgi:service/javax.sql.DataSource/(osgi.jndi.serviceName=
      jndi_name_of_the_data_source)
</jta-data-source>

Il seguente esempio illustra come configurare il nome JNDI di una origine dati quando la configurazione dell'origine dati utilizza un riferimento risorsa Blueprint.

<jta-data-source>
   blueprint:comp/blueprint_component_name
</jta-data-source>

L'esempio riportato di seguito mostra come è configurata l'origine dati che utilizza un riferimento alla risorsa Blueprint:

<blueprint xmlns="..." ... 
   xmlns:rr="http://www.ibm.com/appserver/schemas/8.0/blueprint/
   resourcereference">
   <rr:resource-reference id="blueprint_component_name" 
      interface="javax.sql.DataSource" 
      filter="(osgi.jndi.service.name=jndi_name_of_the_data_source)">
   <rr:res-auth>Container</rr:res-auth>
   <rr:res-sharing-scope>Shareable</rr:res-sharing-scope>
   </rr:resource-reference>
</blueprint>

Per specificare quale versione di provider di persistenza viene accettata, è possibile utilizzare una proprietà personalizzata nel file persistence.xml , come mostrato nel seguente esempio:

<persistence-unit name="myPU">
   <provider>org.apache.openjpa.persistence.PersistenceProviderImpl</provider>
   <properties>
      <property name="org.apache.aries.jpa.provider.version" 
         value="[1.1.0,1.3.0]" />
   </properties>
</persistence-unit>

JPA gestito dal contenitore

Per i bundle Blueprint, è possibile inserire unità e contesti di persistenza utilizzando le annotazioni o un'estensione blueprint.

È possibile inserire le unità e i contesti di persistenza utilizzando le annotazioni @PersistenceUnit e @PersistenceContext su un bean blueprint. L'inserimento mediante annotazione è supportato solo per i componenti gestiti da blueprint.

Il bundle di contesto del contenitore Apache Aries JPA fornisce il seguente spazio nomi Blueprint per l'inserimento di dipendenze di risorse JPA gestite:
http://aries.apache.org/xmlns/jpa/v1.0.0.
È possibile inserire unità e contesti di persistenza utilizzando le tag Blueprint da questo spazio dei nomi. Ad esempio:
<blueprint xmlns:jpa="http://aries.apache.org/xmlns/jpa/v1.0.0" ...>
   ...
   <bean name="myPersistenceBean" class="...">
      <jpa:unit property="emf" unitname="myPU" />
   </bean>
   ...
</blueprint>

JPA gestito dall'applicazione

La specifica OSGi JPA richiede che un'istanza EntityManagerFactory sia disponibile nel registro del servizio per ogni unità di persistenza definita nei descrittori di persistenza.

Il servizio EntityManagerFactory ha tre proprietà di servizio notevoli:
osgi.unit.name
Il nome dell'unità di permanenza per il servizio EntityManagerFactory .
osgi.unit.version
La versione del bundle di persistenza.
osgi.unit.provider
Il nome della classe di implementazione del provider di persistenza per il servizio EntityManagerFactory .