Il solito linguaggio che vedo per la creazione del EntityManager è qualcosa di simile:diversi modi di ottenere l'EntityManager
public class BaseDao {
private static final String PERSISTENCE_UNIT_NAME = "Employee";
EntityManagerFactory factory = Persistence.createEntityManagerFactory(PERSISTENCE_UNIT_NAME);
public EntityManager getEntityManager() {
return factory.createEntityManager();
}
}
allora è usato in questo modo:
Employee emp = new Employee();
emp.setName("Joe M");
getEntityManager().persist(emp);
domanda è perché non farlo in questo modo:
public class BaseDao{
private static final String PERSISTENCE_UNIT_NAME = "Employee";
EntityManagerFactory factory = Persistence.createEntityManagerFactory(PERSISTENCE_UNIT_NAME);
private EntityManager entityManager = null;
public void setEntityManger() {
EntityManagerFactory factory = Persistence.createEntityManagerFactory(PERSISTENCE_UNIT_NAME);
this.entityManager = factory.createEntityManager();
}
public EntityManager getEntityManager() {
return this.entityManager;
}
}
In altre parole, è necessario ottenere sempre il gestore di entità tramite factory.crea teEntityManager()? o può essere creato come variabile istanza (o anche statica) e recuperato in questo modo?
Per chiarire, sto parlando di un ambiente che non utilizza contenitori EJB o Spring.
Grazie.
grazie - Ho aggiunto una nota al mio post originale per chiarire che non sono in un ambiente aziendale, quindi l'iniezione del contenitore non è disponibile. Tuttavia noto il tuo commento sulla sicurezza dei thread. – jayjay
RE thread-safety - Presumo che tu faccia riferimento al mio esempio, dal momento che un EntityManager iniettato e gestito da un contenitore sarebbe thread-safe. – jayjay
No, non sarà thread-safe, ma il contenitore ne crea uno nuovo quando necessario (potrei sbagliarmi), quindi sembra sicuro che sia thread-safe. Se non si utilizza Enterprise Environment, non vedo alcun problema nella creazione di un'istanza statica di fabbrica EntityManagerFactory e la richiamo per ottenere istanze di EntityManager quando necessario. E non forzare a chiuderli dopo ogni transazione. Questo thread mostra un codice che può esserti utile. http://stackoverflow.com/questions/7329873/how-should-manage-database-transactions-using-entity-manager-in-a-relatively-lar – Mansour