2011-09-30 21 views
14

Questa è una domanda accademica; Non ho alcun codice rotto in relazione a questo. Voglio solo espandere la mia comprensione di ciò che sta accadendo sotto il cofano.Come interagiscono UserTransaction e EntityManager?

Il modello di codice che ho usato (copiato dai libri e tutorial) nel mio JPA DAO per i miei tipiche applicazioni web JSF è fondamentalmente questo:

public class someDAO { 

    @PersistenceContext protected EntityManager em; 
    @Resource   private UserTransaction utx;  

    public void persist(Entity entity) { 
     try { 
      utx.begin(); 
      em.persist(entity); 
      utx.commit(); 
     } catch (// gawd awful long list of possible exceptions) 

     // etc 

Quindi le mie domande sono le seguenti:

  1. Perché l'istanza EntityManager e l'istanza UserTransaction sono iniettate con annotazioni da due pacchetti apparentemente non correlati?

  2. Perché è utilizzata l'annotazione @Resource e @PersistenceContext anziché @ManagedProperty o forse @Inject?

  3. modo la persistono) accesso metodo (e interagire con il UTX oggetto? Se dimentico la chiamata utx.begin(), il gestore dell'entità ne è a conoscenza e genera ed eccezione. Deve trovare l'oggetto UserTransaction in qualche modo magico. Non sarebbe stata una migliore architettura definire l'interfaccia come: em.persist (utx, entità)?

  4. Se utx è una sorta di singleton - è possibile avere più di un utenteTransaction aperto alla volta?

Molto grazie per qualsiasi discussione.

+0

Hai considerato EJB? Gli EJB utilizzano transazioni gestite dal contenitore. In questo modo non dovrai preoccuparti di gestire le transazioni da solo (e manterrà i tuoi metodi di servizio liberi da ingombri da catch-catch). – BalusC

+0

I pattern di codice vengono appresi da libri come Burns JSF 2. Non mi interessa molto questo pattern di codice perché sono riuscito a mantenerlo tutto limitato in un oggetto DAO astratto. Tutti i miei DAO concreti si estendono da quell'unico oggetto in modo tale che parte di questo junky (se questa parola si applica) è praticamente fuori dalla vista. Ma non per la mente. – AlanObject

risposta

11
  1. Perché UserTransaction fa parte di Java Transaction API (JTA) e EntityManager fa parte di Java Persistence API (JPA). JTA non fa parte dell'APP. JPA utilizza i servizi forniti da JTA.

  2. Is not ManagedProperty è un'annotazione valida solo nelle classi annotate con @ManagedBean. Forse è stato considerato meglio non iniettare UserTransaction in modo diverso nei bean gestiti.

  3. Ricerca JNDI per transazione attiva. Il nome riservato sembra essere java: comp/UserTransaction. Un'implementazione: http://www.java2s.com/Open-Source/Java-Document/Database-ORM/hibernate/org/hibernate/transaction/JTATransactionFactory.java.htm

  4. Non è una sorta di singleton, è possibile avere più di una. Ma solo uno per thread può essere attivo.

Problemi correlati