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
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!
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.
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
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
Użyj sprężyny, użyj trybu hibernacji. Dlaczego Ejb? – merin
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
}
}
- 1. Prowadzenie otwartego menedżera JPA EntityManager?
- 2. EntityManager ThreadLocal pattern with JPA w JSE
- 3. JPA: Jak działa blokada odczytu?
- 4. Dołączanie dwóch niepowiązanych tabel przy użyciu menedżera JPA EntityManager
- 5. Czy obiekty zapytania JPA są zwracane przez wielokrotnego użytku EntityManager?
- 6. JPA/Hibernate usunąć podmiot czasami nie działa
- 7. Jak działa @CreatedBy w Spring Data JPA?
- 8. Węzeł JPA/Hibernate nie działa.
- 9. Usuwanie obiektu JPA/Hibernuj nie działa
- 10. @XmlRegistry - jak to działa?
- 11. memory_limit: Jak to działa?
- 12. $ parser.unshift ?? jak to działa?
- 13. Jak to działa javascript?
- 14. aspx.designer.cs jak to działa?
- 15. strlen: jak to działa?
- 16. ZF2 i EntityManager (Doctrine)
- 17. Używanie sesji JPA EntityManager i Hibernate z menedżerem transakcji współdzielonych na wiosnę
- 18. HashMap.this.clear() co to znaczy, jak to działa
- 19. Co to jest odpowiednik JPA w .NET?
- 20. JPA EntityManager persist() powoduje, że obiekt wygląda na odłączony, mimo że został zgłoszony błąd.
- 21. Kiedy potrzebujemy więcej niż jednego EntityManager?
- 22. Zastosowanie EntityManager w migracjach złożyć
- 23. EntityManager nie zapisuje do bazy danych
- 24. Jak programowo sprawdzać kwerendę JPQL (kwerenda JPA)
- 25. Spring JPA REST One to Many
- 26. Dlaczego w zapytaniach JPA EntityManager występuje wyjątek NoResultException, ale wyszukiwanie nie powoduje?
- 27. Aktualizacja hibernacji za pomocą EntityManager
- 28. XNA MathHelper.SmoothStep? Jak to działa?
- 29. Jak działa to przypisanie listy?
- 30. wiązania Pythona, jak to działa?
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