2009-09-07 3 views
10

Извините за вопрос noob, но у меня проблемы с JPA + Hibernate, поэтому я подумал, что в моем сознании что-то неясно. У меня есть некоторые сущности, скажем A, B, C, D, и я закодировал AMethods, BMethods, CMethods, DMethods. Каждый из классов * Методы содержит инициализацию EntityManager через EntityManagerFactory и некоторые методы, которые в основном выполняют запросы. Я не знаю, должен ли я использовать шаблон singleton (так, чтобы у меня был класс EntityManager per * Method), или мне нужно открывать и закрывать EntityManager каждый раз, когда я выполняю запрос, или я сохраняю/удаляю объект ... можешь мне помочь??JPA EntityManager, как это работает?

ответ

7

В типичном приложении JPA/Hibernate вы не ставите логику продолжительности в самих классах сущностей. Это большое изменение в философии дизайна по сравнению со старыми приложениями EJB 2.x. Вместо этого многие приложения создают слой объектов доступа к данным - отдельно от объектов, которые используют экземпляры EntityManager для запроса, загрузки и сохранения объектов. Часто это синглтоны, а экземпляры диспетчера сущностей внутри DAO являются локальными для потока.

Если вы используете фреймворк типа Spring, управление экземплярами EntityManager и транзакциями является полностью автоматическим. То же самое с EJB 3, хотя я не использовал это в большом проекте. Я бы посоветовал прочитать главу «Документация весны» о доступе к данным Object-Relational Mapping. Даже если вы не используете Spring в своем приложении, в главе приведены некоторые полезные советы о том, как структурировать ваше приложение многоуровневым способом, который отделяет проблемы сохранения от сохраняемых объектов. Удачи!

+0

Я не использую Spring и я, m, используя DAO, как объяснено (DAO - это классы * Методы), но все они используют один и тот же контекст персистентности. Правильно ли exec createEntityManager в AMethods, а также в методах BMethod, даже если они используют один и тот же контекст персистентности? – Raffo

2

EntityManager связан с контекстом персистентности. Используйте шаблон singleton, если все ваши сущности связаны с одним контекстом. Вы используете jpa на стороне сервера, правильно? Если это так, вы можете инициализировать EntityManager в методах init, например init() на сервлетах.

+0

Я использую тот же контекст сохранения, каждый объект связан с одним контекстом. Я использую jpa на стороне сервера, но я использую его также в приложении java, работающем в фоновом режиме ... Я должен инициализировать контекст в этом приложении и создавать * Методы, передающие EntityManager в качестве параметра ?? – Raffo

+0

Да, если служба и ваше приложение backgound являются различными приложениями, необходимо инициировать EntityManager для обоих. Я думаю, что было бы сложной задачей сериализовать экземпляр EntityMaanger. – merin

+0

Используйте Spring, используйте Hibernate. Почему Ejb? – merin

-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"; частный 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 
} 

}

 Смежные вопросы

  • Нет связанных вопросов^_^