2012-11-17 1 views
3

J'injectais objets EntityManager dans apatrides EJB3 haricots (qui agissent comme objets DAO et chacun donnent accès à une table de base de données différente). Le déploiement est dans JBoss AS 7.Combien d'EntityManagers sont injectés pour un PersistenceContext donné?

I code, puis ajouté à l'aide System.identityHashCode dans les méthodes EJB3 haricots pour voir les différentes instances des EntityManagers injectent (l'espoir de voir la même instance dans tous OTI). Par exemple. comme:

@Stateless 
public class AFacade { 
    @PersistenceContext(unitName="foo") 
    EntityManager em; 

    public List<A> findAll() { 
     l.info("entity manager is: "+System.identityHashCode(em)+" class is: "+em.getClass().getSimpleName()); 
     ... 
    } 

Cependant, ce que je remarqué est que chaque DAO (par exemple AFacade, BFacade et ainsi de suite) a été injecté avec un autre EntityManager (tel que rapporté par identityHashCode) bien le PersistenceContext était le même. La classe d'implémentation était TransactionScopedEntityManager dans tous les cas.

Je ne sais pas pourquoi ces différents objets EntityManager sont injectés, si c'est quelque chose qui devrait me concerner ou non. En outre, je comprends que le conteneur EJB3 peut effectivement injecter des proxies à l'entité EntityManager de sorte que ces différentes instances peuvent effectivement être des proxies à un seul EntityManager.

Répondre

4

Oui, ce sont des proxies (en fait, je pense que ce sont des décorateurs thread-safe, plutôt que des proxies) sur les gestionnaires d'entités réelles. Je ne suis pas sûr si vous savez que EntityManager est un wrapper autour d'une connexion. Si vous n'aviez pas ce décorateur (ou proxy), toutes les invocations à ce bean sans état partageraient la même connexion (et potentiellement la transaction), ce qui n'est pas ce que vous voulez.

4

Les EntityManagers injectés sont générés par les conteneurs EJB.

Pour Transaction SCOPED Les gestionnaires d'entités, chaque transaction utilise un unique instance distincte deEntité Manager Fournisseur.

Lorsqu'un appel de méthode est faite à cette procuration, les contrôles de conteneurs javax.transaction.TransactionSynchronizationRegistry (ce qui est mis en œuvre par conteneur EJB) pour voir s'il y a un fournisseur EntityManager déjà créé pour cette opération. Sinon, il créera le fournisseur Entity Manager et l'enregistrera dans TransactionSynchronizationRegistry, puis lui déléguera l'appel de méthode. S'il est déjà présent, il récupérera simplement le fournisseur Entity Manager et lui déléguera l'appel de méthode.

transaction EntityManagers scope sont apatrides selon le livre "Pro JPA2 Maîtriser l'API Java Persistence" par Mike Keith et Merrick Schincariol (Voir le chapitre 6).

Les objets proxy insérés dans chaque objet d'instance EJB sont différents, bien qu'un seul objet proxy ait pu être utilisé en raison de la nature sans état de Transity Entity Manager.

Regardez également: http://piotrnowicki.com/2011/11/am-i-in-the-same-transaction-am-i-using-the-same-persistencecontext/

Questions connexes