Отношения между EJB 3.0 и JPA? - PullRequest
       37

Отношения между EJB 3.0 и JPA?

16 голосов
/ 30 октября 2011

Это может показаться очевидным, но я видел противоречивые утверждения: является ли JPA частью EJB 3.0?Я не специалист, и это меня смущает.

Если так, JPA манипулирует Entity Beans?Эти бины сущности являются интерфейсом между постоянным уровнем и бизнес-уровнем, реализующим логику с бинами без сохранения состояния?

Основной вопрос для меня заключается в том, как реализовать функцию «поиск пользователя по различным критериям», гдезапрос "search" - его строковое представление - должен быть построен?Я имею в виду, что если JPA не является частью EJB, мои компоненты не должны знать о модели данных, верно?

Где граница?

Ответы [ 4 ]

15 голосов
/ 30 октября 2011

Является ли JPA частью EJB 3.0?

Да и нет ... Да , поскольку каждый сервер приложений, претендующий на реализацию спецификации EJB 3.0, также должен обеспечивать реализацию JPA. Нет , поскольку JPA может легко находиться вне EJB, в автономных приложениях или в приложениях, управляемых Spring.

JPA манипулирует объектными компонентами?

Бины сущностей была страшной идеей в EJB до 3.0. JPA использует термин лица , чтобы отличить себя от позорной истории. Но да, сущности JPA - это способ сопоставить таблицы базы данных с простыми объектами Java. В принципе, изменения, внесенные в объект, распространяются на базу данных и наоборот (упрощение).

Как я уже сказал, JPA не имеет никакой зависимости от EJB (рассматриваемого как сессионные компоненты без сохранения состояния и состояния) и наоборот. Но ничто не мешает вам использовать JPA в EJB.

В вашем сценарии у вас будет EJB без состояния, создающий запрос и взаимодействующий с базой данных через JPA. Технически говоря, вы будете вызывать методы для EntityManager, введенные вашему бину:

@Stateless
public class SearchService {

    @PersistenceContext
    private EntityManager em;

    public List<User> findUsersBornAfter(Date date) {
        return em.
            createQuery("SELECT u FROM User u WHERE u.birthDate > :birthDate ORDER BY name").
            setParameter("birthDate", date).
            getResultList();
    }
}

Как вы можете видеть, бизнес-уровень осведомлен о модели данных (очевидно), но в отношении сущностей нет зависимости от EJB / бизнес-сервисов. В этом примере JPQL (запрос) формируется на уровне сервиса, а User является сущностью JPA. При вызове getResultList() провайдер JPA переводит JPQL в SQL, запускает запрос и переводит результаты обратно в User экземпляров объекта.

Граница между EJB и JPA теперь ясна?

8 голосов
/ 30 октября 2011

Пара заметок:

  • когда дело доходит до JSR, JPA 1.0 была частью EJB 3.0. См. Здесь , JPA 2.0 - это отдельная JSR ( см. Здесь )
  • "сущностные бины" - это EJB pre-3.0, и они, к счастью, мертвы. Их сменил JPA.
  • когда дело доходит до зависимостей - JPA не зависит от EJB, а EJB не зависит от JPA. Однако EJB может обрабатывать внедрение диспетчера сущностей JPA
  • Вы можете использовать любой из них автономно
  • каждый сервер приложений поддерживает оба
3 голосов
/ 31 октября 2011

Добавление к ответу BalusC, из Википедии - Enterprise JavaBean:

Обратите внимание, что текущая спецификация EJB 3.1 не детализирует, как сервер приложений обеспечивает постоянство (задача, делегированная спецификации JPA), но вместо этого подробно описывает, как бизнес-логика может легко интегрироваться с сервисами персистентности, предлагаемыми сервером приложений.

Интеграция устраняет некоторые болевые точки у JPA, а именно довольно многословный и шумный запуск и фиксацию / откат транзакции и определение области видимости extended persistence context (последняя для только сессионных компонентов Statefull).

Добавление к ответу Божо:

  • В EJB 3.0 JPA 1.0 был частью EJB, но как подспецификация и мог использоваться вне EJB и вне Java EE.
  • В EJB 3.1 JPA полностью отделен от EJB, а JPA 2.0 на 100% является отдельным JSR.
1 голос
/ 30 октября 2011

Из Википедии - API персистентности Java:

Enterprise JavaBeans

В спецификацию EJB 3.0 (которая входит в платформу Java EE 5) включено определение API персистентности Java. Однако конечные пользователи не нуждаются в контейнере EJB или сервере приложений Java EE для запуска приложений, использующих этот постоянный API. [1] Будущие версии Java Persistence API будут определены в отдельной JSR и спецификации, а не в EJB JSR / спецификации. API персистентности Java заменяет персистентное решение EJB 2.0 CMP (постоянство, управляемое контейнером).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...