Plug-in JPAEntityLoader

El plug-in JPAEntityLoader es una implementación de cargador incorporada que utiliza Java Persistence API (JPA) para comunicarse con la base de datos cuando se utiliza la API EntityManager. Al utilizar la API ObjectMap, utilice el cargador JPALoader.

Detalles del cargador

Utilice el plug-in JPALoader cuando almacene los datos utilizando la API ObjectMap. Utilice el plug-in JPAEntityLoader cuando almacene los datos mediante la API EntityManager.

Los cargadores proporcionan dos funciones principales:
  1. get: en el método get, el plug-in JPAEntityLoader llama en primer lugar al método javax.persistence.EntityManager.find(Class entityClass, Object key) para encontrar la entidad JPA. El plug-in proyecta esta entidad JPA en los tuples de entidad. Durante la proyección, los atributos del tuple y las claves de la asociación se almacenan en el tuple de valor. Después de procesar cada clave, el método get devuelve una lista de tuples de valor de entidad.
  2. batchUpdate: el método batchUpdate toma un objeto LogSequence que contiene una lista de objetos LogElement. Cada objeto LogElement contiene un tuple de clave y un tuple de valor. Para interactuar con el proveedor de JPA, en primer lugar, debe encontrar la entidad eXtreme Scale basada en el tuple de clave. Basándose en el tipo LogElement, ejecute las siguientes llamadas de JPA:
    • insert: javax.persistence.EntityManager.persist(Object o)
    • update: javax.persistence.EntityManager.merge(Object o)
    • remove: javax.persistence.EntityManager.remove(Object o)
Un LogElement con el tipo update realiza la llamada de JPAEntityLoader al método javax.persistence.EntityManager.merge(Object o) para fusionar la entidad. Sin embargo, un tipo update de LogElement podría ser el resultado de una llamada a com.ibm.websphere.objectgrid.em.EntityManager.merge(object o) o un cambio de atributo de la instancia gestionada por el EntityManager de eXtreme Scale. Consulte el siguiente ejemplo:
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();

En este ejemplo, un tipo update de LogElement se envía al JPAEntityLoader del consumidor de la correlación. Se llama al método javax.persistence.EntityManager.merge(Object o) en el gestor de entidades JPA, en lugar de una actualización de atributo a la entidad gestionada por JPA. Debido a este cambio de comportamiento, existen algunas limitaciones con el uso de este modelo de programación.

Reglas sobre el diseño de aplicaciones

Las entidades tienen relaciones con otras entidades. Para diseñar una aplicación con relaciones y con un JPAEntityLoader conectado debe tenerse en cuenta una serie de consideraciones adicionales. La aplicación debe seguir cuatro reglas, que se describen en los apartados siguientes.

Soporte de profundidad de relaciones limitada

JPAEntityLoader sólo se admite al utilizar entidades sin ninguna relación o entidades con relaciones de un único nivel. No están soportadas las relaciones con más de un nivel como, por ejemplo, Compañía > Departamento > Empleado.

Un cargador por correlación

Si utiliza las relaciones de entidad Consumer-ShippingAddress como ejemplo, al cargar Consumer con el tipo FETCH establecido en EAGER, puede cargar todos los objetos ShippingAddress relacionados. Al persistir o fusionar un objeto Consumer, puede persistir o fusionar los objetos ShippingAddress relacionados si se ha habilitado el valor cascade-persist o cascade-merge.

No puede conectar un cargador de la correlación de entidad raíz que almacene los tuples de entidad Consumer. Debe configurar un cargador para cada correlación de entidad.

Mismo tipo de valor cascade para JPA y eXtreme Scale

Vuelva a considerar el escenario en el que la entidad Consumer tiene una relación de uno a muchos con ShippingAddress. Puede consultar el escenario donde se ha habilitado el valor cascade-persist para esta relación. Cuando se persiste un objeto Consumer en eXtreme Scale, el número N asociado de objetos ShippingAddress también se persistirá en eXtreme Scale.

Una llamada de persistencia del objeto Consumer con una relación cascade-persist con ShippingAddress se convierte en una llamada al método javax.persistence.EntityManager.persist(consumer) y el cargador JPAEntityLoader llama N veces al método javax.persistence.EntityManager.persist(shippingAddress). Sin embargo, estas N llamadas de persistencia adicionales a los objetos ShippingAddress no son necesarias debido al valor cascade-persist desde el punto de vista del proveedor JPA. Para resolver este problema, eXtreme Scale proporciona un nuevo método isCascaded en la interfaz LogElement. El método isCascaded indica si el LogElement es un resultado de una operación cascade de eXtreme Scale EntityManager. En este ejemplo, el JPAEntityLoader de la correlación de ShippingAddress recibe N objetos LogElement debido a las llamadas persistencias en cascada. JPAEntityLoader descubre que el método isCascaded devuelve un valor true y, a continuación, los ignora sin realizar ninguna llamada de JPA. Por lo tanto, desde un punto de vista de JPA, sólo se recibe una llamada del método javax.persistence.EntityManager.persist(consumer).

Este comportamiento se repite si fusiona o elimina una entidad con el valor en cascada habilitado. El plug-in JPAEntityLoader ignora todas las operaciones en cascada.

El diseño del soporte de cascade es reproducir las operaciones de EntityManager de eXtreme Scale para los proveedores JPA. Estas operaciones son persistir, fusionar y eliminar. Para habilitar el soporte de operaciones cascade, verifique que el valor de cascade para el JPA y el EntityManager de eXtreme Scale son iguales.

Use la actualización de entidad con precaución

Como se ha descrito previamente, el diseño del soporte de cascade es reproducir las operaciones EntityManager de eXtreme Scale para los proveedores JPA. Si la aplicación llama al método ogEM.persist(consumer) en el EntityManager de eXtreme Scale, aunque los objetos ShippingAddress asociados se persistan debido al valor de cascade-persist, y JPAEntityLoader sólo llama al método jpAEM.persist(consumer) en los proveedores JPA.

Sin embargo, si la aplicación actualiza una entidad gestionada, el plug-in JPAEntityLoader convertirá esta actualización en una llamada de fusión JPA. En este escenario, no está garantizado el soporte de varios niveles de relaciones y asociaciones de claves. En este caso, el procedimiento recomendado es utilizar el método javax.persistence.EntityManager.merge(o), en lugar de actualizar una entidad gestionada.