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