Plug-in JPAEntityLoader

O plug-in JPAEntityLoader é uma implementação Loader integrada que usa o Java Persistence API (JPA) para se comunicar com o banco de dados quando usar a API EntityManager. Ao utilizar a API do ObjectMap, utilize o utilitário de carga JPALoader.

Detalhes do Utilitário de Carga

Use o plug-in do JPAEntityLoader ao armazenar dados usando a API ObjectMap. Use o plug-in do JPAEntityLoader ao armazenar dados usando a API EntityManager.

Os Utilitários de Carga fornecem duas funções principais:
  1. get: No método get, o primeiro plug-in JPAEntityLoader chama o método javax.persistence.EntityManager.find(Class entityClass, Object key) para localizar a entidade JPA. Em seguida, o plug-in projeta esta entidade do JPA nas tuplas de entidades. Durante a projeção, ambos os atributos de tuplas e as chaves de associação são armazenados na tupla de valor. Após o processamento de cada chave, o método get retorna uma lista de tuplas de valor de entidades.
  2. batchUpdate: O método batchUpdate usa um objeto LogSequence que contém uma lista de objetos LogElement. Cada objeto LogElement contém uma tupla de chave uma tupla de valor. Para interagir com o provedor JPA, primeiro é necessário localizar a entidade eXtreme Scale com base na tupla de chave. Com base no tipo LogElement, execute as seguintes chamadas JPA:
    • insert: javax.persistence.EntityManager.persist(Object o)
    • update: javax.persistence.EntityManager.merge(Object o)
    • remove: javax.persistence.EntityManager.remove(Object o)
Um LogElement com tipo update faz o JPAEntityLoader chamar javax.persistence.EntityManager.merge(Object o) para mesclar a entidade. Além disso, um LogElement com tipo update pode ser o resultado de uma chamada com.ibm.websphere.objectgrid.em.EntityManager.merge(object o) ou uma mudança de atributo da instância gerenciada EntityManager de eXtreme Scale. Consulte o seguinte exemplo:
com.ibm.websphere.objectgrid.em.EntityManager em = og.getSession().getEntityManager();
em.getTransaction().begin();
Consumer c1 = (Consumer) em.find(Consumer.class, c.getConsumerId());
c1.setName("New Name");
em.getTransaction().commit();

Neste exemplo, um LogElement de tipo atualizar é enviado para o JPAEntityLoader do consumidor do mapa. O método javax.persistence.EntityManager.merge(Object o) será chamado para o gerenciador de entidade do JPA em vez de um atributo atualizar para a entidade gerenciada do JPA. Devido a esta mudança de comportamento, há algumas limitações na utilização deste modelo de programação.

Regras de Design do Aplicativo

Entidades possuem relacionamentos com outras entidades. Projetar um aplicativo com relacionamentos envolvidos e com JPAEntityLoader conectado requer considerações adicionais. O aplicativo deve seguir as quatro regras a seguir, descritas nas seções a seguir.

Suporte à Profundidade de Relacionamentos Limitado

O JPAEntityLoader é suportado apenas ao utilizar entidades sem nenhum relacionamento ou entidades com relacionamentos de nível único. Relacionamentos com mais de um nível, como por exemplo, Company > Department > Employee não são suportados.

Um Utilitário de Carga por Mapa

Utilizando os relacionamentos da entidade Consumer-ShippingAddress como um exemplo, quando você carrega um consumidor com a busca ávida ativada, é possível carregar todos os objetos ShippingAddress relacionados. Quando você persiste ou funde um objeto Consumer, é possível persistir ou fundir objetos ShippingAddress relacionados se cascade-persist ou cascade-merge estiver ativado.

Não é possível conectar um utilitário de carga para o mapa da entidade-raiz que armazena as tuplas da entidade Consumer. É necessário configurar um utilitário de carga para cada mapa de entidade.

Mesmo tipo de cascata para JPA e eXtreme Scale

Considere novamente o cenário no qual a entidade Consumer possui um relacionamento um-para-muitos com ShippingAddress. É possível examinar o cenário no qual cascade-persist está ativado para este relacionamento. Quando um objeto Consumer é persistido no eXtreme Scale, o número N associado de objetos ShippingAddress será também será persistido no eXtreme Scale.

Uma chamada de persistência do objeto Consumer com um relacionamento cascade-persist com ShippingAddress converte-se em um método javax.persistence.EntityManager.persist(consumer) e N chamadas javax.persistence.EntityManager.persist(shippingAddress) pela camada JPAEntityLoader. Entretanto, estas N chamadas de persistência extra para ShippingAddress são desnecessárias devido à configuração cascade-persist do ponto de vista do provedor JPA. Para solucionar este problema, o eXtreme Scale fornece um novo método isCascaded na instância LogElement. O método isCascaded indica se LogElement é um resultado de uma operação em cascata EntityManager do eXtreme Scale. Neste exemplo, o JPAEntityLoader do mapa ShippingAddress recebe N objetos LogElement devido às chamadas de persistência em cascata. O JPAEntityLoader descobre que o método isCascaded retorna true e, em seguida, ignora-os sem fazer nenhuma chamada JPA. Portanto, a partir de um ponto de vista do JPA, apenas uma chamada javax.persistence.EntityManager.persist(consumer) é recebida.

O mesmo comportamento é exibido se você fundir uma entidade ou remover uma entidade com cascata ativada. As operações em cascata são ignoradas pelo plug-in JPAEntityLoader.

A estrutura do suporte de cascata é para reproduzir as operações EntityManager do eXtreme Scale para os provedores JPA. Estas operações incluem operações persist, merge e remove. Para ativar o suporte de cascata, verifique se a configuração de cascata para o JPA e o EntityManager do eXtreme Scale sejam os mesmos.

Utilize a Atualização de Entidades com Cuidado

Como descrito anteriormente, a estrutura do suporte em cascata é para reproduzir as operações EntityManager do eXtreme Scale para os provedores do JPA. Se o aplicativo chamar o método ogEM.persist(consumer) para o EntityManager do eXtreme Scale, mesmos os objetos ShippingAddress associados serão persistidos devido à configuração cascade-persist e o JPAEntityLoader chama apenas o método jpAEM.persist(consumer) para os provedores JPA.

Entretanto, se o aplicativo atualizar uma entidade gerenciada, essa atualização será convertida em uma chamada de mesclagem JPA pelo plug-in JPAEntityLoader. Neste cenário, o suporte para vários níveis de relacionamentos e associações-chave não é garantido. Neste caso, a boa prática é utilizar o método javax.persistence.EntityManager.merge(o) em vez de atualizar uma entidade gerenciada.