Изучаем Java EE 7 - [116]
>book.setPrice(12.5F);
>book.setDescription("Научно-фантастический комедийный сериал, созданный Дугласом Адамсом");
>book.setIsbn("1-84023-742-2");
>book.setNbOfPage(354);
>book.persistToDatabase();
В архитектуре служб вы делегировали бы бизнес-логику внешней службе. Службы без сохранения состояния идеально подходят, когда вам необходимо выполнить задачу, с которой можно справиться одним вызовом метода (передав при этом все необходимые параметры). Службы без сохранения состояния независимы, обособленны и не требуют информации или состояния от одного запроса к другому. Таким образом, если вы возьмете предыдущий код и добавите службу без сохранения состояния, то вам потребуется создать объект Book, задать кое-какие значения, а затем воспользоваться службой без сохранения состояния для вызова метода, который обеспечит постоянство Book от его имени одним вызовом. Состояние будет поддерживать Book, а не служба без сохранения состояния:
>Book book = new Book();
>book.setTitle("Автостопом по Галактике");
>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 "";
>}
Параметр name определяет имя EJB-компонента и по умолчанию имеет значение в виде имени класса (ItemEJB в листинге 7.6). Этот параметр можно задействовать, например, для поиска EJB-компонента с применением JNDI. Параметр description — это строка, которая может быть использована для описания EJB-компонента. Атрибут mappedName определяет глобальное JNDI-имя, присваиваемое контейнером. Следует отметить, что это JNDI-имя зависит от поставщика и, следовательно, не является переносимым. mappedName не имеет связи с переносимым

Что такое ГЕЙМДИЗАЙН? Это не код, графика или звук. Это не создание персонажей или раскрашивание игрового поля. Геймдизайн – это симулятор мечты, набор правил, благодаря которым игра оживает. Как создать игру, которую полюбят, от которой не смогут оторваться? Знаменитый геймдизайнер Тайнан Сильвестр на примере кейсов из самых популярных игр рассказывает как объединить эмоции и впечатления, игровую механику и мотивацию игроков. Познакомитесь с принципами дизайна, которыми пользуются ведущие студии мира! Создайте игровую механику, вызывающую эмоции и обеспечивающую разнообразие.

В книге рассказывается история главного героя, который сталкивается с различными проблемами и препятствиями на протяжении всего своего путешествия. По пути он встречает множество второстепенных персонажей, которые играют важные роли в истории. Благодаря опыту главного героя книга исследует такие темы, как любовь, потеря, надежда и стойкость. По мере того, как главный герой преодолевает свои трудности, он усваивает ценные уроки жизни и растет как личность.

Это практическое руководство разработчика программного обеспечения на Visual Basic .NET и ADO.NET, предназначенное для создания приложений баз данных на основе WinForms, Web-форм и Web-служб. В книге описываются практические способы решения задач доступа к данным, с которыми сталкиваются разработчики на Visual Basic .NET в своей повседневной деятельности. Книга начинается с основных сведений о создании баз данных, использовании языка структурированных запросов SQL и системы управления базами данных Microsoft SQL Server 2000.

В книге рассказывается история главного героя, который сталкивается с различными проблемами и препятствиями на протяжении всего своего путешествия. По пути он встречает множество второстепенных персонажей, которые играют важные роли в истории. Благодаря опыту главного героя книга исследует такие темы, как любовь, потеря, надежда и стойкость. По мере того, как главный герой преодолевает свои трудности, он усваивает ценные уроки жизни и растет как личность.

В книге рассказывается история главного героя, который сталкивается с различными проблемами и препятствиями на протяжении всего своего путешествия. По пути он встречает множество второстепенных персонажей, которые играют важные роли в истории. Благодаря опыту главного героя книга исследует такие темы, как любовь, потеря, надежда и стойкость. По мере того, как главный герой преодолевает свои трудности, он усваивает ценные уроки жизни и растет как личность.

Python - объектно-ориентированный язык сверхвысокого уровня. Python, в отличии от Java, не требует исключительно объектной ориентированности, но классы в Python так просто изучить и так удобно использовать, что даже новые и неискушенные пользователи быстро переходят на ОО-подход.