В некоторой степени связано с моим другим вопросом Должны ли необработанные аннотированные POJO Hibernate возвращаться из уровня доступа к данным или интерфейсов вместо этого? , у меня есть опыт в создании красиво разделенных слоев, но без использования Hibernate или J2EE / JPA. Я просматривал документацию и учебные пособия и озадачен тем, как элегантно использовать EntityManger, поскольку кажется, что он отвечает как за транзакции (которые я хочу делать на своем уровне обслуживания), так и за методы устойчивости (которые я хочу сохранить на уровне доступа к данным). Должен ли я создать его на уровне сервиса и внедрить в уровень доступа к данным, или есть лучший способ? Приведенная ниже псевдо-java примерно показывает, что я собираюсь делать.
РЕДАКТИРОВАТЬ: Мой псевдокод, приведенный ниже, по существу взят из учебника JPA для гибернации и модифицирован для разделения слоев и не отражает того, что продукт разрабатывается для работы в контейнере EJB (Glassfish). В своих ответах приведите передовой опыт и примеры кода для кода, выполняемого в Glassfish или аналогичном.
MyService
{
setup()
{
EntityManagerFactory entityManagerFactory = Persistence.createEntityManagerFactory( "Something" ); //is the String you pass in important?
entityManager = entityManagerFactory.createEntityManager();
}
myServiceMethod()
{
entityManager.getTransaction().begin();
MyDao.setEntityManager(entityManagerFactory);
MyDao.doSomething();
MyDao.doSomethingElse();
entityManager.getTransaction().commit();
entityManager.close();
}
}
MyDao
{
doSomething()
{
entityManager.persist(...); //etc
}
}