Le plug-in JPAEntityLoader est une implémentation pré-intégrée de chargeur qui repose sur Java Persistence API (JPA) pour communiquer avec la base de données lors de l'utilisation de l'API EntityManager. Lorsque vous utilisez l'API ObjectMap, faites appel au chargeur JPALoader.
Utilisez le plug-in JPALoader lorsque vous stockez des données à l'aide de l'API ObjectMap. Utilisez le plug-in JPAEntityLoader lorsque vous stockez des données à l'aide de l'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();
Dans cet exemple, un objet LogElement de type update est envoyé au plug-in JPAEntityLoader du consommateur de mappe. La méthode javax.persistence.EntityManager.merge(Object o) est appelée dans le gestionnaire d'entité JPA au lieu d'une mise à jour d'attribut dans l'entité gérée par JPA. En raison de ce changement de comportement, l'utilisation de ce modèle de programmation est sujette à certaines limitations.
Des relations peuvent aussi exister entre une entité et d'autres entités. La conception d'une application avec l'implication de relations et la connexion du plug-in JPAEntityLoader entraîne d'autres considérations. L'application doit suivre les quatre règles décrites dans les sections ci-dessous.
Le plug-in JPAEntityLoader est uniquement pris en charge lors de l'utilisation d'entités sans relations ou d'entités présentant des relations à un seul niveau. Ces relations à un seul niveau, telles que Company > Department > Employee ne sont pas prises en charge.
En utilisant l'exemple des relations d'entités Consumer-ShippingAddress lors du chargement d'un consommateur avec l'extraction hâtive activée, vous pouvez charger tous les objets liés ShippingAddress. Lorsque vous conservez ou fusionnez un objet Consumer, vous pouvez conserver ou fusionner les objets liés ShippingAddress si cascade-persist ou cascade-merge est activée.
Vous ne pouvez pas connecter un chargeur pour la mappe d'entité racine qui stocke les tuples d'entité Consumer. Vous devez configurer un chargeur pour chaque mappe d'entité.
Réexaminez le scénario dans lequel l'entité Consumer entretient une relation un à plusieurs avec ShippingAddress. Vous pouvez examiner le scénario dans lequel cascade-persist est activée pour cette relation. Lorsqu'un objet Consumer est conservé dans eXtreme Scale, le nombre N associé d'objets ShippingAddress est également conservé dans eXtreme Scale.
Un appel persist de l'objet Consumer présentant une relation cascade-persist à l'objet ShippingAddress est convertie vers un appel de méthode javax.persistence.EntityManager.persist(consumer) et N appels de méthode javax.persistence.EntityManager.persist(shippingAddress) par la couche JPAEntityLoader. Toutefois, ces N appels persist supplémentaires aux objets ShippingAddress sont superflus en raison du paramètre cascade-persist du point de vue du fournisseur JPA. Pour résoudre ce problème, eXtreme Scale fournit une nouvelle méthode isCascaded sur l'interface LogElement. La méthode isCascaded indique si l'objet LogElement résulte d'une opération en cascade eXtreme Scale EntityManager. Dans cet exemple, le plug-in JPAEntityLoader de la mappe ShippingAddress reçoit N objets LogElement en raison des appels en cascade. Le plug-in JPAEntityLoader détecte que la méthode isCascaded renvoie la valeur true, puis l'ignore sans effectuer d'appels JPA. Par conséquent, d'un, point de vue JPA, un seul appel de méthode javax.persistence.EntityManager.persist(consumer) est reçu.
Le même comportement se présente si vous fusionnez ou supprimez une entité en mode cascade. Les opérations en cascade sont ignorées par le plug-in JPAEntityLoader.
La conception de la prise en charge en cascade consiste à relire les opérations de eXtreme Scale EntityManager dans les fournisseurs JPA. Ces opérations incluent les opérations persist, merge et remove. Pour activer le mode en cascade, vérifiez que les paramètres de cascade pour JPA et eXtreme Scale EntityManager sont identiques.
Comme décrit plus haut, la conception de la prise en charge en cascade consiste à relire les opérations de eXtreme Scale EntityManager dans les fournisseurs JPA. Si votre application appelle la méthode ogEM.persist(consumer) dans eXtreme Scale EntityManager, même les objets ShippingAddress associés sont conservés car le paramètre cascade-persist et le plug-in JPAEntityLoader appellent la méthode jpAEM.persist(consumer) dans les fournisseurs JPA.
Cependant, si votre application met à jour une entité gérée, cette mise à jour est convertie en appel merge JPA par le plug-in JPAEntityLoader. Dans ce scénario, la prise en charge de plusieurs niveaux de relations et d'associations clé n'est pas garantie. Dans ce cas, la meilleure pratique consiste à utiliser la méthode javax.persistence.EntityManager.merge(o) et non de mettre à jour une entité gérée.