2009-09-07 52 views
10

對不起Noob的問題,但我遇到了JPA + Hibernate的問題,所以我認爲在我的腦海中有些東西不清楚。 我有一些實體,比如說A,B,C,D和我編碼了AMethods,BMethods,CMethods,DMethods。每個* Methods類包含通過EntityManagerFactory進行的EntityManager初始化以及一些基本上執行查詢的方法。我不知道是否應該使用單例模式(以便每個* Method類有一個EntityManager),或者如果我需要在每次執行查詢時打開和關閉EntityManager,或者堅持/刪除實體...你可以幫我嗎??JPA EntityManager,它是如何工作的?

回答

7

在典型的JPA/Hibernate應用程序中,您不會將持久性邏輯放在實體類本身中。與舊的EJB 2.x應用程序相比,這是設計理念的重大變化。相反,許多應用程序創建一個數據訪問對象層(與實體分離),它們使用EntityManager實例來查詢,加載和保存實體。通常,這些是單例,DAO內的實體管理器實例是線程本地的。

如果您使用像Spring這樣的框架,EntityManager實例和事務的管理是完全自動的。與EJB 3一樣,雖然我沒有在大型項目中使用過。我建議閱讀Spring文檔有關Object-Relational Mapping數據訪問的章節。即使你最終沒有在應用程序中使用Spring,本章也會提供一些關於如何以分層方式構建應用程序的好技巧,從而將持久性問題與持久化實體分開。祝你好運!

+0

我不使用Spring, m使用DAO(DAO是* Methods類),但它們都使用相同的持久化上下文。在AMethods中執行createEntityManager並且在BM方法中使用相同的持久性上下文也是正確的? – Raffo 2009-09-07 17:56:44

2

EntityManager與持久性上下文相關聯。如果您的所有實體都與一個上下文關聯,請使用單例模式。 你在服務器端使用jpa,對不對?如果是這樣,你可以在init方法中初始化EntityManager,比如servlet上的init()。

+0

我使用相同的持久化上下文,每一個實體與一個上下文關聯。我在服務器端使用jpa,但是我也在後臺運行的java應用程序中使用它...我應該在此應用程序中初始化上下文並創建*傳遞EntityManager作爲參數的方法? – Raffo 2009-09-07 17:52:34

+0

是的,如果服務和您的背景應用程序是不同的應用程序,則有必要爲兩者啓動EntityManager。 我認爲這將是一個艱難的任務序列化EntityMaanger實例。 – merin 2009-09-07 18:04:52

+0

使用Spring,使用Hibernate。爲什麼Ejb? – merin 2009-09-07 18:05:30

-1

就這樣!

公共接口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 
} 

}

相關問題