Lo siento por la pregunta de novato, pero estoy teniendo problemas con JPA + Hibernate, así que pensé que algo no estaba claro en mi mente. Tengo algunas entidades, digamos A, B, C, D y he codificado AMethods, BMethods, CMethods, DMethods. Cada una de las * clases de métodos contiene la inicialización de EntityManager a través de EntityManagerFactory y algunos métodos que básicamente ejecutan consultas. No sé si debería usar un patrón singleton (para que tenga un EntityManager por * clase de método) o si necesito abrir y cerrar EntityManager cada vez que ejecuto una consulta o si persisto/elimino una entidad ... ¿¿me puedes ayudar??JPA EntityManager, ¿cómo funciona?
Respuesta
En una aplicación típica de JPA/Hibernate, no se pone la lógica de persistencia en las clases de entidad. Este es un gran cambio en la filosofía de diseño en comparación con las aplicaciones anteriores de EJB 2.x. En cambio, muchas aplicaciones crean una capa de objetos de acceso a datos, separada de las entidades, que utilizan instancias de EntityManager para consultar, cargar y guardar entidades. A menudo, estos son singletons, y las instancias del gestor de entidades dentro de los DAO son locales para el hilo.
Si utiliza un marco como Spring, la gestión de las instancias y transacciones de EntityManager es completamente automática. Lo mismo con EJB 3, aunque no lo he usado en un proyecto grande. Sugeriría leer el capítulo de la documentación de Spring en el acceso a datos Object-Relational Mapping. Incluso si no termina usando Spring en su aplicación, el capítulo brinda algunos buenos consejos sobre cómo estructurar su aplicación de una manera estratificada que separa los problemas de persistencia de las entidades que persisten. ¡Buena suerte!
EntityManager está asociado a un contexto de persistencia. Use un patrón singleton si todas sus entidades están asociadas con un contexto. Utiliza jpa en el lado del servidor, ¿verdad? Si es así, puede inicializar EntityManager en métodos init, como init() en servlets.
Puedo usar el mismo contexto de persistencia, cada entidad está asociada con un contexto. Uso jpa en el lado del servidor pero también lo uso en una aplicación Java que se ejecuta en segundo plano ... Debo inicializar el contexto en esta aplicación y crear * Métodos que pasen el EntityManager como parámetro ?? – Raffo
Sí, si el servicio y su aplicación de fondo son diferentes aplicaciones, es necesario iniciar EntityManager para ambas. Creo que sería una tarea difícil serializar la instancia de EntityMaanger. – merin
Use Spring, use Hibernate. ¿Por qué Ejb? – merin
como este!
ProtokollDAOService interfaz pública {
/**
* 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 { privado static final Cadena PERSISTENCE_UNIT_NAME = "ProtokollManager"; private 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
}
}
- 1. JPA EntityManager ¿Estático o Instancia?
- 2. Cómo inyectar JPA EntityManager utilizando la primavera
- 3. Invalidación de la sesión de JPA EntityManager
- 4. Entidad de actualización utilizando EntityManager JPA EclipseLink
- 5. JPA EntityManager find with case sensitive key
- 6. ¿Cómo implementar el método update() en DAO usando EntityManager (JPA)?
- 7. JPA: ¿Cómo funciona el bloqueo de lectura?
- 8. ¿Debo cerrar() cada EntityManager?
- 9. La operación de eliminación de JPA entitymanager no se realiza
- 10. Ejecutar una consulta Create Table a través de JPA EntityManager
- 11. Unir dos tablas no relacionadas usando JPA EntityManager
- 12. Actualización de EntityManager
- 13. ¿Cómo burlarse de EntityManager?
- 14. Inyectando EntityManager vs. EntityManagerFactory
- 15. Application vs Container Managed EntityManager
- 16. cómo podemos conseguir APP EntityManager trabajo Flush
- 17. hibernación pruebas unitarias JPA autodection no funciona
- 18. Eclipselink: ¿Cómo se obtiene EntityManager en cada paquete?
- 19. JPA EntityManager persist() provocando que el objeto aparezca separado aunque se produjo un error
- 20. ¿Son los objetos de consulta de JPA devueltos por un EntityManager reutilizable?
- 21. JPA 2.0 utilizando Hibernate como proveedor - Excepción: No proveedor de persistencia para EntityManager
- 22. Spring, Hibernate & JPA: La llamada persiste en entitymanager no parece comprometerse con la base de datos
- 23. ¿Por qué en las consultas de JPA EntityManager arroja NoResultException pero no encuentra?
- 24. Spring + Hibernate + JPA
- 25. PersistenceContext EntityManager NullPointerException inyección
- 26. ¿Cuándo necesitamos más de un EntityManager?
- 27. Prueba de la unidad Spring/JTA/JPA: Rollback no funciona
- 28. entidad de eliminación de JPA/Hibernate no funciona
- 29. javax.persistence.PersistenceException: No proveedor de persistencia para EntityManager llamado customerManager
- 30. Conexión JPA dinámica
No uso Spring ni I ' m usando DAO tal como se explicó (los DAO son las * clases de métodos) pero todos usan el mismo contexto de persistencia. ¿Es correcto ejecutar createEntityManager en AMethods y también en BMethods, incluso si utilizan el mismo contexto de persistencia? – Raffo