JPA e Aplicativos OSGi

Você pode usar Java™ Persistence API (JPA) em Aplicações OSGi de forma semelhante à JPA em aplicativos Java EE . Este tópico descreve as diferenças no uso da JPA com pacotes configuráveis de persistência em um aplicativo OSGi.

Os aplicativos OSGi usam pacotes configuráveis de persistência para definir as entradas e os serviços que outros pacotes configuráveis (ou o próprio pacote configurável de persistência) podem usar.

Um pacote configurável de persistência é um pacote configurável OSGi que contém um ou mais descritores de persistência (arquivos persistence.xml) e possui um cabeçalho Meta-Persistence no manifesto do pacote configurável, META-INF/MANIFEST.MF. Este cabeçalho lista todos os locais de arquivos persistence.xml no pacote de persistência. Quando esse cabeçalho está presente, o local padrão, META-INF/persistence.xml, é incluído pelo padrão. Por isso, quando os arquivos persistence.xml estão no local padrão, o cabeçalho Meta-Persistence deve estar presente, mas seu conteúdo pode estar vazio (um único espaço).

O exemplo a seguir de um cabeçalho Meta-Persistence define um pacote configurável de persistência com dois descritores de persistência, um em entities e um no jar aninhado lib/thirdPartyEntities.jar. Qualquer arquivo persistence.xml que esteja no local padrão também pode ser utilizado.

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

O suporte para aplicativos OSGi pode ser gerenciado por contêiner ou gerenciado por aplicativo. O JPA não gerenciado não é suportado para aplicativos OSGi.

É possível usar a JPA em pacotes configuráveis de aplicativos da Web (WABs) da mesma maneira que você usa a JPA em archives de aplicativo da Web (arquivos WAR), desde que toda a lógica de persistência esteja contida no aplicativo da Web.

Para obter mais informações, consulte as seguintes seções e o tópico relacionado sobre o desenvolvimento de aplicativos que usam JPA.

Descritores de Persistência

Em arquivos persistence.xml para um aplicativo OSGi, os elementos jta-data-source e non-jta-data-source acessam as fontes de dados por meio de uma consulta Java Naming and Directory Interface (JNDI), uma consulta de JNDI ao registro de serviço ou através de Blueprint. Este comportamento é em vez das consultas Java Naming and Directory Interface (JNDI) que são usadas em aplicativos Java EE . Os exemplos a seguir mostram a sintaxe para um 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>

O exemplo a seguir mostra como configurar o nome JNDI de uma origem de dados quando a configuração da origem de dados usar uma referência de recurso Blueprint.

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

O exemplo a seguir mostra com a origem de dados que usa uma referência de recurso Blueprint é configurada:

<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>

Para especificar que versão de um provedor de persistência é aceita, é possível usar uma propriedade customizada no arquivo persistence.xml, como mostrado no exemplo a seguir:

<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 Gerenciado por Contêiner

Para pacotes configuráveis blueprint, é possível injetar contextos de persistência e unidades utilizando anotações ou uma extensão blueprint.

É possível injetar contextos de persistência e unidades usando as anotações @PersistenceUnit e @PersistenceContext em um bean blueprint. A injeção através de anotação é suportada apenas para componentes gerenciados pelo Blueprint.

O pacote configurável de contexto do contêiner Apache Aries JPA fornece o seguinte namespece de blueprint para injeção de dependência dos recursos gerenciados JPA:
http://aries.apache.org/xmlns/jpa/v1.0.0.
É possível injetar contextos de persistência e unidades usando as tags de blueprint a partir desse namespace. Por exemplo:
<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 gerenciado pelo aplicativo

A especificação da JPA OSGi requer que uma instância EntityManagerFactory está disponível no registro de serviço para cada unidade de persistência que está definida nos descritores de persistência.

O serviço EntityManagerFactory possui três propriedades de serviço notáveis:
osgi.unit.name
O nome da unidade de persistência para o serviço EntityManagerFactory .
osgi.unit.version
A versão do pacote configurável de persistência.
osgi.unit.provider
O nome da classe de implementação do provedor de persistência para o serviço EntityManagerFactory.