2009-09-07 19 views
10

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

7

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!

+0

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

2

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.

+0

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

+0

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

+0

Use Spring, use Hibernate. ¿Por qué Ejb? – merin

-1

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 
} 

}

Cuestiones relacionadas