Извините за вопрос noob, но у меня проблемы с JPA + Hibernate, поэтому я подумал, что в моем сознании что-то неясно. У меня есть некоторые сущности, например A, B, C, D, и я кодировал AMethods, BMethods, CMethods, DMethods. Каждый из классов * Методы содержит инициализацию EntityManager через EntityManagerFactory и некоторые методы, которые в основном выполняют запросы. Я не знаю, должен ли я использовать шаблон singleton (так, чтобы у меня был класс EntityManager per * Method), или мне нужно открывать и закрывать EntityManager каждый раз, когда я выполняю запрос, или я сохраняю/удаляю объект... вы можете мне помочь?
JPA EntityManager, как это работает?
Ответ 1
В типичном приложении JPA/Hibernate вы не ставите логику продолжительности в самих классах сущностей. Это большое изменение в философии дизайна по сравнению со старыми приложениями EJB 2.x. Вместо этого многие приложения создают слой объектов доступа к данным - отдельно от объектов, которые используют экземпляры EntityManager для запроса, загрузки и сохранения объектов. Часто это синглтоны, а экземпляры диспетчера сущностей внутри DAO являются локальными для потока.
Если вы используете фреймворк вроде Spring, управление экземплярами EntityManager и транзакциями полностью автоматическое. То же самое с EJB 3, хотя я не использовал это в большом проекте. Я бы предложил прочитать раздел документации Spring по Object-Relational Mapping доступ к данным. Даже если вы не используете Spring в своем приложении, в главе приведены некоторые полезные советы о том, как структурировать ваше приложение многоуровневым способом, который отделяет проблемы сохранения от сохраняемых объектов. Удачи!
Ответ 2
EntityManager связан с контекстом сохранения. Используйте шаблон singleton, если все ваши сущности связаны с одним контекстом. Вы используете jpa на стороне сервера, правильно? Если это так, вы можете инициализировать EntityManager в методах init, например init() на сервлетах.
Ответ 3
просто так!
открытый интерфейс 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 { private static final String PERSISTENCE_UNIT_NAME = "ProtokollManager"; частный 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
}
}