Spring JPA : géré par l'Application de contexte de persistance avec @Transactionnelle et @PersistenceContext

Actuellement, im essayant de la géré par l'application de contexte de persistance, par la création de l'entité gestionnaire manuellement et de les stocker afin de permettre des transactions qui s'étend sur plusieurs demande d'appels (peut-être quelque chose comme contexte de persistance étendue) dans la JSE application.

Mais, im me demandais si je peux éviter l'envoi de l'objet entityManager tout au long du service et des méthodes DAO comme un paramètre supplémentaire en faisant usage du ressort de l' @PersistenceContext d'injection et de marquer les méthodes avec @Transactional annotation à utiliser le début de la transaction manuellement avec l'entité gestionnaire.

Je pense que je peux en quelque sorte gérer cela en utilisant un ThreadLocal pour cette fonction, mais je vais être plus heureux d'être en mesure de joindre le présent pour le framework spring.

Ceci est un exemple de Ce que j'ai à l'esprit :


L'INTERFACE utilisateur de la méthode d'action :

Ici, nous pouvons voir l'opération est lancée par la logique de l'interface utilisateur, puisqu'il n'y iss sans façade /méthode de commande dans le backend de groupe de ces appels à la logique d'entreprise :

Long transactionid = tool.beginTransaction();

//calling business methods
tool.callBusinessLogic("purchase", "receiveGoods", 
                        paramObject1, transactionid);

tool.callBusinessLogic("inventory", "updateInventory", 
                        paramObject2, transactionid);

tool.commitTransaction(transactionid);

À l'intérieur de l'outil :

public Long beginTransaction() {
  //create the entity --> for the @PersistentContext
  Entitymanager entityManager = createEntityManagerFromFactory();
  long id = System.currentTimeMillis();
  entityManagerMap.put(id, entitymanager);

  //start the transaction --> for the @Transactional ?
  entityManager.getTransaction().begin();

  return id;
}

public void commitTransaction(Long transactionId) {
  EntityManager entityManager = entityManagerMap.get(transactionId);

  entityManager.getTransaction().commit();
}

public Object callBusinessLogic(String module, String function, 
                        Object paramObject, Long transactionid) {
    EntityManager em = entityManagerMap.get(transactionId);

    //=================================
    //       HOW TO DO THIS????
    //=================================
    putEntityManagerIntoCurrentPersistenceContext(em);

    return executeBusinessLogic(module, function, paramObject, transactionid);
}

Et l'exemple de la méthode de service :

public class Inventory {
  //How can i get the entityManager that's been created by the tool for this thread ?
  @PersistenceContext
  private EntityManager entityManager;

  //How can i use the transaction with that transactionId ?
  @Transactional
  public void receiveGoods(Param param) {
    //........
  }
}

Est-il de toute façon pour y parvenir ?

Merci !

InformationsquelleAutor bertie | 2011-02-24