2009-09-07 21 views
10

Przepraszamy za pytanie noob, ale mam problemy z JPA + Hibernate, więc myślałem, że coś nie jest jasne w mojej głowie. Mam pewne byty, powiedzmy A, B, C, D i mam kodowane AMethods, BMethods, CMethods, DMethods. Każda z klas * Methods zawiera inicjację EntityManager za pośrednictwem EntityManagerFactory i kilka metod, które zasadniczo wykonują kwerendy. Nie wiem, czy powinienem używać wzorca singleton (tak, żebym posiadał klasę EntityManager na * Method) lub gdy potrzebuję otwierać i zamykać EntityManager za każdym razem, gdy wykonuję zapytanie lub utrzymuję/usuwam encję ... możesz mi pomóc??JPA EntityManager, jak to działa?

Odpowiedz

7

W typowej aplikacji JPA/Hibernate, nie umieszczasz logiki trwałości w samych klasach jednostek. To duża zmiana w filozofii projektowania w porównaniu do starszych aplikacji EJB 2.x. Zamiast tego wiele aplikacji tworzy warstwę obiektów dostępu do danych - oddzielnych od jednostek - wykorzystujących instancje EntityManager do wysyłania zapytań, ładowania i zapisywania encji. Często są to pojedynczo, a instancje menedżera encji wewnątrz obiektów DAO są lokalne dla wątku.

Jeśli używasz frameworka takiego jak Spring, zarządzanie instancjami i transakcjami EntityManager jest całkowicie automatyczne. To samo dotyczy EJB 3, chociaż nie korzystałem z tego w przypadku dużego projektu. Sugerowałbym przeczytanie rozdziału wiosennej dokumentacji o dostępie do danych. Nawet jeśli nie skończysz używać Springa w swojej aplikacji, rozdział ten podaje kilka dobrych wskazówek, jak ułożyć aplikację w warstwowy sposób, który oddziela utrapienia od utrzymywanych jednostek. Powodzenia!

+0

Nie używam Springa i I ' m przy użyciu DAO jak wyjaśniono (DAO są klasami * Methods), ale wszystkie używają tego samego kontekstu trwałości. Prawidłowe jest wykonywanie createEntManager w AMethods, a także w BMethods, nawet jeśli używają tego samego kontekstu trwałości? – Raffo

2

EntityManager jest powiązany z kontekstem utrwalania. Użyj pojedynczego wzorca, jeśli wszystkie twoje jednostki są powiązane z jednym kontekstem. Używasz jpa po stronie serwera, prawda? Jeśli tak, możesz zainicjować EntityManager w metodach init, takich jak init() na servlets.

+0

użyć tego samego kontekstu trwałości, każda jednostka jest związana z jednym kontekście. Używam jpa na serwerze, ale używam go również w aplikacji java działającej w tle ... Powinienem zainicjować kontekst w tej aplikacji i utworzyć * Metody przekazujące EntityManager jako parametr ?? – Raffo

+0

Tak, jeśli usługa i aplikacja do tworzenia stron są różnymi aplikacjami, konieczne jest zainicjowanie EntityManager dla obu. Myślę, że trudno byłoby serializować instancję EntityMaanger. – merin

+0

Użyj sprężyny, użyj trybu hibernacji. Dlaczego Ejb? – merin

-1

Po prostu tak!

publicznego ProtokollDAOService interfejs {

/** 
* 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(); 

}

public class ProtokollDAOImpl realizuje ProtokollDAOService {private static final String PERSISTENCE_UNIT_NAME = "ProtokollManager"; prywatny obiekt EntityManagerFactoryFactory;

/* 
* (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 
} 

}

Powiązane problemy