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