book.setPrice(12.5F);
book.setDescription("Научно-фантастический комедийный сериал, созданный Дугласом Адамсом.");
book.setIsbn("1-84023-742-2");
book.setNbOfPage(354);
statelessService.persistToDatabase(book);
Сессионные EJB-компоненты без сохранения состояния придерживаются архитектуры служб и являются самой эффективной компонентной моделью, поскольку могут быть помещены в пул и совместно использоваться несколькими клиентами. Это означает, что для каждого EJB-компонента без сохранения состояния контейнер оставляет определенное количество экземпляров в памяти (то есть в пуле) и позволяет клиентам совместно использовать их. Поскольку EJB-компоненты без сохранения состояния не обладают клиентским состоянием, все экземпляры являются одинаковыми. Когда клиент вызывает метод в EJB-компоненте без сохранения состояния, контейнер берет экземпляр из пула и присваивает его клиенту. По завершении выполнения клиентского запроса экземпляр возвращается в пул для повторного использования. Это означает, что вам потребуется лишь небольшое количество EJB-компонентов для обслуживания нескольких клиентов, как показано на рис. 7.4. Контейнер не гарантирует одного и того же экземпляра для одного и того же клиента.
Рис. 7.4. Клиенты, осуществляющие доступ к EJB-компонентам без сохранения состояния в пуле
В листинге 7.6 показано, как выглядит EJB-компонент без сохранения состояния: стандартный Java-класс со всего одной аннотацией @Stateless. Поскольку он располагается в контейнере, у него есть возможность использовать любые службы, управляемые контейнером, одна из которых позволяет внедрять зависимости. Мы применяем аннотацию @PersistenceContext для внедрения ссылки на менеджер сущностей. В случае с сессионными EJB-компонентами без сохранения состояния контекст постоянства является транзакционным, а это означает, что любой метод, вызываемый в этом EJB-компоненте (createBook(), createCD() и т. д.), будет транзакционным. Этот процесс более подробно объясняется в главе 9. Следует отметить, что у всех методов есть необходимые параметры для обработки бизнес-логики одним вызовом. Например, метод createBook() принимает объект Book в качестве параметра и обеспечивает его постоянство без расчета на другое состояние.
@Stateless
public class ItemEJB {
··@PersistenceContext(unitName = "chapter07PU")
··private EntityManager em;
··public List
····TypedQuery
····return query.getResultList();
··}
··public List
····TypedQuery
····return query.getResultList();
··}
··public Book createBook(Book book) {
····em.persist(book);
····return book;
··}
··public CD createCD(CD cd) {
····em.persist(cd);
····return cd;
··}
}
EJB-компоненты без сохранения состояния зачастую содержат несколько тесно связанных бизнес-методов. Например, ItemEJB из листинга 7.5 определяет методы, связанные с элементами, продажа которых осуществляется в приложении CD-BookStore. Таким образом, вы найдете методы для создания, обновления или поиска экземпляров Book и CD, а также другой связанной бизнес-логики.
Аннотация @Stateless помечает Java-объект ItemEJB как EJB-компонент без сохранения состояния, тем самым превращая простой Java-класс в компонент, поддерживающий контейнер. В листинге 7.7 описывается спецификация аннотации @javax.ejb.Stateless.
@Target({TYPE}) @Retention(RUNTIME)
public @interface Stateless {
····String name() default "";
····String mappedName() default "";
····String description() default "";
}