JPA EntityManager, ¿cómo funciona?
-
21-09-2019 - |
Pregunta
Lo siento por la pregunta noob, pero estoy teniendo problemas con JPA + Hibernate, así que pensé que algo no está claro en mi mente. Tengo algunas entidades, dicen A, B, C, D y he codificado AMethods, BMethods, CMethods, DMethods. Cada una de las clases * Los métodos de inicialización contienen EntityManager a través EntityManagerFactory y algunos métodos que, básicamente, ejecutar consultas. No sé si debo utilizar un patrón Singleton (por lo que tengo una clase EntityManager por * Método) o si necesito para abrir y cerrar el EntityManager cada vez que ejecute una consulta o persisto / eliminar una entidad ... puede que me ??
ayudaSolución
En una aplicación típica JPA / Hibernate, usted no pone persistencia lógica en las clases de entidad en sí. Este es un gran cambio en la filosofía de diseño en comparación con las aplicaciones EJB 2.x mayores. En cambio, muchas aplicaciones crean una capa de Data Access Objects - separado de las entidades - que las instancias de uso EntityManager a consulta, cargar y guardar entidades. A menudo, estos son únicos, y las instancias del gestor de entidad dentro de los DAOs local de la rosca.
Si utiliza un marco como la primavera, la gestión de los casos y transacciones EntityManager es completamente automático. Lo mismo con EJB 3, aunque no he usado que en un proyecto grande. Yo sugeriría leer el capítulo de la documentación del resorte en
Otros consejos
EntityManager se asocia con un contexto de persistencia. Utilice un patrón singleton si todas las entidades suyo están asociados con un contexto. Se utiliza JPA en el lado del servidor, ¿verdad? Si es así usted puede inicializado EntityManager en los métodos de arranque, init () en servlets.
al igual que este!
interfaz pública ProtokollDAOService {
/**
* Fügt ein Protokollobjekt in die Datenbank hinzu.
*
* @param object
*/
public void addProtokoll (ProtokollModel object);
/**
* Läd aus einer Datenbank Protokoll-Elemente und fügt sie in eine Liste hinzu
*
* @return List <ProtokollModel> Liste mit Protokoll-Elementen
*/
public List <ProtokollModel> getProtokolls ();
/**
* Liefert ein Protokoll-Element aus der Datenbank anhand der ID;
*
* @param id
* @return ProtokollModel Protokoll-Element
*/
public ProtokollModel getProtokollById (long id);
/**
* Liefert eine Liste von Protokoll-Elementen anhand des Problem-Status
*
* @param solved
* @return List <ProtokollModel> Liste mit Protokoll-Elementen
*/
public List <ProtokollModel> getProtokollByProblemStatus (boolean solved);
/**
* Liefert eine Liste von Protokoll-Elementen anhand des Aufgaben-Status
*
* @param ready
* @return List <ProtokollModel> Liste mit Protokoll-Elementen
*/
public List <ProtokollModel> getProtokollByAufgabenStatus (boolean ready);
/**
* Liefert ein Protokoll-Element anhand des Problems
*
* @param problem
* @return List <ProtokollModel> Liste mit Protokoll-Elementen
*/
public List <ProtokollModel> getProtokollByProblem (String problem);
/**
* Liefert ein Protokoll-Element anhand der Aufgabe
*
* @param aufgabe
* @return List <ProtokollModel> Liste mit Protokoll-Elementen
*/
public List <ProtokollModel> getProtokollByAufgabe (String aufgabe);
/**
* Ausgabe der Protokoll-Tabelle
*
*/
public void printTable ();
}
clase pública implementa ProtokollDAOImpl ProtokollDAOService { estática final privado Cadena PERSISTENCE_UNIT_NAME = "ProtokollManager"; privada EntityManagerFactory entityFactory;
/*
* (non-Javadoc)
*
* @see util.ProtokollDAOService#addProtokoll(model.ProtokollModel)
*/
public void addProtokoll(ProtokollModel object) {
try
{
entityFactory = Persistence
.createEntityManagerFactory(PERSISTENCE_UNIT_NAME);
EntityManager em = entityFactory.createEntityManager();
// Transaction starten
em.getTransaction().begin();
// Object zum speichern
em.persist(object);
// commit senden an die DB / Transaction abschliessen
em.getTransaction().commit();
// DB connection schliessen
em.close();
}
catch (Exception e)
{
Logger.console("Exception wurde ausgelösst! " + e);
e.printStackTrace();
}
}
/*
* (non-Javadoc)
*
* @see util.ProtokollDAOService#getProtokollByAufgabe(java.lang.String)
*/
public List<ProtokollModel> getProtokollByAufgabe(String aufgabe) {
// TODO Auto-generated method stub
return null;
}
/*
* (non-Javadoc)
*
* @see util.ProtokollDAOService#getProtokollByAufgabenStatus(boolean)
*/
public List<ProtokollModel> getProtokollByAufgabenStatus(boolean ready) {
// TODO Auto-generated method stub
return null;
}
/*
* (non-Javadoc)
*
* @see util.ProtokollDAOService#getProtokollById(long)
*/
public ProtokollModel getProtokollById(long id) {
try
{
entityFactory = Persistence
.createEntityManagerFactory(PERSISTENCE_UNIT_NAME);
EntityManager em = entityFactory.createEntityManager();
// Transaction starten
em.getTransaction().begin();
// Object aus der DB laden
Query q = em.createQuery("select m from ProtokollModel m where m.id=:id");
// Parameter setzen - siehe PreparedStatment
q.setParameter("id", id);
// liefert das Protokoll-Element zurück
ProtokollModel pm = (ProtokollModel) q.getSingleResult();
// commit senden an die DB / Transaction abschliessen
em.getTransaction().commit();
// db connection schliessen
em.close();
return pm;
}
catch (Exception e)
{
Logger.console("Exception wurde ausgelösst! " + e);
e.printStackTrace();
} finally {
}
return null;
}
/*
* (non-Javadoc)
*
* @see util.ProtokollDAOService#getProtokollByProblem(java.lang.String)
*/
public List<ProtokollModel> getProtokollByProblem(String problem) {
// TODO Auto-generated method stub
return null;
}
/*
* (non-Javadoc)
*
* @see util.ProtokollDAOService#getProtokollByProblemStatus(boolean)
*/
public List<ProtokollModel> getProtokollByProblemStatus(boolean solved) {
// TODO Auto-generated method stub
return null;
}
/*
* (non-Javadoc)
*
* @see util.ProtokollDAOService#getProtokolls()
*/
public List<ProtokollModel> getProtokolls() {
// TODO Auto-generated method stub
return null;
}
/*
* (non-Javadoc)
*
* @see util.ProtokollDAOService#printTable()
*/
public void printTable() {
// TODO Auto-generated method stub
}
}