Как следует использовать EntityManager в хорошо разделенном уровне обслуживания и уровне доступа к данным?

В некоторой степени связано с моим другим вопросом Должны ли необработанные аннотированные 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 
    }

}

10
задан Community 23 May 2017 в 12:30
поделиться