2016-02-18 2 views
0

Я разрабатываю очень простое веб-приложение с веб-службой REST, которое использует JPA для взаимодействия с базой данных PostgreSQL и работает в TomEE.Должен ли EntityManager вводиться в EJB?

Я не верю, что у меня есть потребность (или желание) вручную управлять жизненным циклом EntityManager, поэтому я планирую разгрузить эту рутину на TomEE с помощью управляемых EntityManager контейнеров (вероятно, с областью транзакций).

Я не считаю, что мне нужно (или желание) вручную управлять транзакцией JTA, которую требуется Управлять управляемыми EntityManager.

Наконец, я планирую использовать классы DAO для разделения любых запросов из бизнес-логики, которая является моей веб-службой REST.

Является ли мой лучший вариант для каждого класса DAO EJB, который использует аннотацию @PersistenceContext для получения ссылки на EntityManager? Если да, то какой тип EJB должен быть DOAs? Я видел примеры/блоги, предлагающие безгражданство, состояние, синглтон и даже полностью забыть DAO, введя EntityManager в самих веб-сервисах. Каков наилучший способ справиться с этим?

ответ

0

Каждый DAO должен быть сессионным компонентом без состояния, в котором вводятся ссылки на БД.

Было бы лучше иметь GenericDAO для выполнения операций CRUD через EntityManager, чтобы избежать повторения кода вокруг EJB.

Обычно я предпочитаю создавать также один EJB для каждого Ws-клиента, если какой-либо сервис должен быть вызван.

В случае предоставления Ws-сервера я всегда добавляю экземпляр EJB, который мне нужен, а не вставлять экземпляр EntityManager, поскольку было бы хорошо иметь единую точку доступа.

+0

EntityManager уже предоставляет операции CRUD; почему бы вы обернуть его более (избыточным) кодом? –

+0

В чем смысл вводить снова и снова EntityManager, если у вас уже есть DAO для этой области? Затем, введя его повсюду, вы не можете знать, где данные меняются ... У вас не будет единой точки доступа для нее –

0

Создание класса EJB предоставит классу некоторые функции, которыми управляет EJB, и управление контейнером, например управление транзакциями, безопасность потоков, безопасность и т. Д.

В статье Ejb in Action говорится, что рекомендуется иметь простой класс DAO (не EJB), который работает с EntityManager. Классы DAO не должны участвовать в управлении транзакциями и других функциях, которые EJB имеет, вместо этого всегда должен быть EJB, который использует класс DAO (с помощью аннотации @Inject), а другие службы, такие как веб-службы REST или SOAP, должны вызывать EJB, которые используют DAO, который нам нужен.

Преобразование всех классов, таких как классы DAO и классы полезности в EJB, поставит бремя на плечо контейнера и затруднит управление всеми EJB.

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