Mudanças de comportamento da API de Persistência Java 2.1

Se você já usa o recurso jpa-2.0 para seus aplicativos, continue usando o recurso jpa-2.0 para seus aplicativos existentes para evitar quaisquer problemas de migração. Para novos aplicativos, é melhor usar o recurso jpa-2.1, que permite aproveitar os novos recursos que estão disponíveis na especificação do JPA 2.1. Se você deseja mudar seus aplicativos existentes para usar o recurso jpa-2.1 em vez do recurso jpa-2.0, pode ser necessário ajustar seu aplicativo no processo de migração.

Diferenças entre o jpa-2.0 e o jpa-2.1

Esteja ciente de algumas diferenças principais entre os recursos jpa-2.0 e jpa-2.1. Veja o seguinte:

Diferenças de nome de classe de PersistenceProvider
jpa-2.0
  • IBM® provedor:com.ibm.websphere.persistence.PersistenceProviderImpl
  • Provedor OpenJPA: org.apache.openjpa.persistence.PersistenceProviderImpl
jpa-2.1
  • org.eclipse.persistence.jpa.PersistenceProvider
Diferenças de comportamento de armazenamento em cache

jpa-2.0: o armazenamento em cache está desativado por padrão. Se o seu aplicativo precisa aproveitar um cache L2, deve-se ativá-lo explicitamente.

jpa-2.1: por padrão, o provedor EclipseLink possui o cache L2 e o QueryCache ativado. Assegure-se de que essa configuração seja a melhor opção para seus aplicativos. Se você estiver executando em um ambiente distribuído, como um cluster, é necessário desativar o cache ou entender que nós diferentes podem ter dados diferentes.

Diferenças de aprimoramento/entrelaçamento

jpa-2.0: o OpenJPA requer que as entidades sejam aprimoradas. Para obter mais informações, consulte Aprimoramento de entidades JPA para JPA 2.0 na documentação do produto.

jpa-2.1: o EclipseLink funciona com entidades não aprimoradas. O WebSphere Application Server suporta aprimoramento estático.

Alguns recursos podem não estar disponíveis, como o carregamento lento e alguns ganhos de desempenho.

  • Se as classes de entidade forem aprimoradas estaticamente para uso com o provedor jpa-2.0 (OpenJPA), as classes deverão ser recompiladas antes de usar o provedor jpa-2.1.
  • Se o Liberty estiver configurado para usar o recurso jpa-2.1 e as entidades forem aprimoradas usando o aprimoramento OpenJPA , o erro a seguir será lançado.:
    java.lang.NoClassDefFoundError: 
    org.apache.openjpa.enhance.PersistenceCapable.
  • O NoClassDefFoundError ocorre porque classes OpenJPA não estão disponíveis para o servidor no tempo de execução quando o servidor Liberty está configurado para usar jpa-2.1.
    • Para resolver esse problema, recompile o aplicativo e assegure-se de que as entidades não sejam aprimoradas com o otimizador do OpenJPA. Ou então, não aprimore as entidades de modo algum ou aprimore as entidades usando o aprimoramento do EclipseLink em vez do aprimoramento do OpenJPA.
    • Alternativamente, deixe as entidades em seu estado aprimorado e reconfigure o Liberty para usar o recurso jpa-2.0 . O resultado é alguma perda de funcionalidade do JPA 2.1.
Diferenças de uso de origem de dados

O recurso jpa-2.0 usa de forma moderada o non-jta-datasource, portanto, algumas conexões non-jta-datasource são necessárias quando estiver ajustando um aplicativo.

O jpa-2.1 usa uma conexão non-jta-datasource quando ele lê dados e quando uma transação não está ativa. Isso significa que os conjuntos de conexões non-jta-datasource precisam ser maiores ao usar esse recurso.

Consulte a página do guia de migração OpenJPA -> EclipseLink para obter mais diferenças entre os dois provedores JPA..

Recursos do JPA 2.1 disponíveis no OpenJPA

O OpenJPA, o provedor JPA 2.0, possui recursos que funcionam de forma semelhante aos novos recursos do JPA 2.1. Isso significa que se você tiver um aplicativo existente que usa o recurso jpa-2.0 e deseja usar alguns dos recursos do JPA 2.1, não é necessário alternar para o recurso jpa-2.1. Em vez disso, é possível usar o equivalente do novo recurso que é fornecido pelo OpenJPA. Alguns dos recursos chave do JPA 2.1 que estão disponíveis no OpenJPA são:

Geração do Esquema

Com esse recurso, é possível gerar DDL ou interagir diretamente com o banco de dados para definir esquemas de tabela com base na definição de entidade JPA. Para obter mais informações, consulte a seção 9.4 da especificação do JPA 2.1.

Recurso equivalente OpenJPA : Mapeador de Esquema

Gráficos de entidade

Com esse recurso, é possível especificar a busca ou o processamento de um gráfico de objetos de entidade. Para obter mais informações, consulte a seção 3.7 da especificação do JPA 2.1.

OpenJPA recurso equivalente: FetchPlan e FetchGroup

Consultas de procedimento armazenado

Com esse recurso, é possível chamar procedimentos que são armazenados em bancos de dados. Para obter mais informações, consulte a seção 3.10.17 da especificação do JPA 2.1.

Recurso equivalente OpenJPA : Chamada de consulta

Conversão básica de tipo de atributo

Com esse recurso, é possível converter entre uma representação de entidade de atributo e uma representação de banco de dados para atributos de tipo básico. Para obter mais informações, consulte a seção 3.8 da especificação do JPA 2.1.

Recurso equivalente do OpenJPA : Recurso do Externalizador

Anotações @Index e @ForeignKey

Consulte as seções 11.1.19 e 11.1.23 da especificação do JPA 2.1.

OpenJPA recurso equivalente: OpenJPA's @Index e @ForeignKey.

Métodos de utilitário de desagrupamento para EntityManager, Cache

Consulte as seções 3.1.1 e 7.10 da especificação do JPA 2.1.

OpenJPA recursos equivalentes: EntityManagerImpl.unwrap() e OpenJPAPersistence.cast().

Construção de objeto ao mapear resultados a partir do SQL nativo

Consulte a seção 3.10.16.2.2 da especificação do JPA 2.1.

Recurso equivalente do OpenJPA : objeto ResultShape