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:
Perché l'istanza EntityManager e l'istanza UserTransaction sono iniettate con annotazioni da due pacchetti apparentemente non correlati?
Perché è utilizzata l'annotazione @Resource e @PersistenceContext anziché @ManagedProperty o forse @Inject?
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à)?
Se utx è una sorta di singleton - è possibile avere più di un utenteTransaction aperto alla volta?
Molto grazie per qualsiasi discussione.
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
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