Plug-in JPAEntityLoader

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.

Détails du chargeur

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.

Les chargeurs présentent deux fonctions principales :
  1. get : dans la méthode get, le plug-in JPAEntityLoader appelle en premier la méthode javax.persistence.EntityManager.find(Class entityClass, Object key) pour trouver l'entité JPA. Le plug-in projette ensuite cette entité JPA dans les tuples d'entité. Pendant la projection, les attributs de tuple et les clés associées sont stockés dans le tuple de valeur. Après le traitement de chaque clé, la méthode get renvoie une liste de tuples de valeur d'entité.
  2. batchUpdate : la méthode batchUpdate concerne un objet LogSequence qui contient une liste d'objets LogElement. Chaque objet LogElement contient un tuple de clé et un tuple de valeur. Pour interagir avec le fournisseur JPA, vous devez tout d'abord trouver l'entité eXtreme Scale en fonction du tuple de clé. Vous exécutez en fonction du type LogElement les appels JPA suivants :
    • insert: javax.persistence.EntityManager.persist(Object o)
    • update: javax.persistence.EntityManager.merge(Object o)
    • remove: javax.persistence.EntityManager.remove(Object o)
Un objet LogElement de type update provoque l'appel de la méthode javax.persistence.EntityManager.merge(Object o) par le plug-in JPAEntityLoader pour fusionner l'entité. Toutefois, un objet LogElement de type update peut résulter d'un appel com.ibm.websphere.objectgrid.em.EntityManager.merge(object o) ou d'une modification d'attribut de l'instance eXtreme Scale gérée par l'API EntityManager. Examinez l'exemple suivant :
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.

Règles de conception des applications

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.

Prise en charge d'une profondeur de relations limitée

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.

Un chargeur par mappe

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

Même type de cascade pour JPA et eXtreme Scale

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.

Utilisation prudente de la mise à jour d'entités

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.