對不起Noob的問題,但我遇到了JPA + Hibernate的問題,所以我認爲在我的腦海中有些東西不清楚。 我有一些實體,比如說A,B,C,D和我編碼了AMethods,BMethods,CMethods,DMethods。每個* Methods類包含通過EntityManagerFactory進行的EntityManager初始化以及一些基本上執行查詢的方法。我不知道是否應該使用單例模式(以便每個* Method類有一個EntityManager),或者如果我需要在每次執行查詢時打開和關閉EntityManager,或者堅持/刪除實體...你可以幫我嗎??JPA EntityManager,它是如何工作的?
回答
在典型的JPA/Hibernate應用程序中,您不會將持久性邏輯放在實體類本身中。與舊的EJB 2.x應用程序相比,這是設計理念的重大變化。相反,許多應用程序創建一個數據訪問對象層(與實體分離),它們使用EntityManager實例來查詢,加載和保存實體。通常,這些是單例,DAO內的實體管理器實例是線程本地的。
如果您使用像Spring這樣的框架,EntityManager實例和事務的管理是完全自動的。與EJB 3一樣,雖然我沒有在大型項目中使用過。我建議閱讀Spring文檔有關Object-Relational Mapping數據訪問的章節。即使你最終沒有在應用程序中使用Spring,本章也會提供一些關於如何以分層方式構建應用程序的好技巧,從而將持久性問題與持久化實體分開。祝你好運!
EntityManager與持久性上下文相關聯。如果您的所有實體都與一個上下文關聯,請使用單例模式。 你在服務器端使用jpa,對不對?如果是這樣,你可以在init方法中初始化EntityManager,比如servlet上的init()。
我使用相同的持久化上下文,每一個實體與一個上下文關聯。我在服務器端使用jpa,但是我也在後臺運行的java應用程序中使用它...我應該在此應用程序中初始化上下文並創建*傳遞EntityManager作爲參數的方法? – Raffo 2009-09-07 17:52:34
是的,如果服務和您的背景應用程序是不同的應用程序,則有必要爲兩者啓動EntityManager。 我認爲這將是一個艱難的任務序列化EntityMaanger實例。 – merin 2009-09-07 18:04:52
使用Spring,使用Hibernate。爲什麼Ejb? – merin 2009-09-07 18:05:30
就這樣!
公共接口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();
}
公共類ProtokollDAOImpl實現ProtokollDAOService { 私有靜態最後字符串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. Spring + Hibernate + jpa它是如何工作的?
- 2. breezejs的EntityManager如何工作?
- 3. JPA的EntityManager應該是RequestScoped?
- 4. JPA - PersistenceUtil.isLoaded - 它加載在哪個EntityManager?
- 5. JPA EntityManager問題
- 6. @PersistenceContext EntityManager(JPA)
- 7. JPA的EntityManager和JavaFX
- 8. 。它是如何工作的?
- 9. JPA的EntityManager find方法不起作用
- 10. 的EntityManager是空與XMLless JPA 2.1
- 11. 我們怎樣才能JPA EntityManager的沖洗工作
- 12. JPA - Hibernate Session被關閉,但EntityManager的工作
- 13. GWT-P + JPA Hibernate EntityManager
- 14. Cloud Foundry + JPA + Spring + EntityManager
- 15. 如何在Hibernate JPA中使用EntityManager @FilterJoinTable?
- 16. 如何使用spring注入JPA EntityManager
- 17. JPA的EntityManager的createQuery()錯誤
- 18. JPA的EntityManager或Spring的HibernateTemplate
- 19. CSS - 它是如何工作
- 20. LexikJWTAuthenticationBundle它是如何工作
- 21. JPA entitymanager刪除操作性能不高
- 22. 與JPA EntityManager的問題
- 23. JPA的EntityManager沒有entityManager.clear
- 24. JPA entity.save(EntityManager的)反模式
- 25. OpenLayers.Control.Scale.template - 它是如何工作的,它一直工作嗎?
- 26. JPA如何實際工作?
- 27. JPA CascadeType.PERSIST如何工作?
- 28. Jenkins的種子工作是什麼?它是如何工作的?
- 29. Animate.css - 它是如何工作的?如何使其自動工作?
- 30. 什麼是懶惰的策略,它是如何工作的?
我不使用Spring, m使用DAO(DAO是* Methods類),但它們都使用相同的持久化上下文。在AMethods中執行createEntityManager並且在BM方法中使用相同的持久性上下文也是正確的? – Raffo 2009-09-07 17:56:44