Enterprice java bean
Компоненты EJB:
1. session bean - используется для описании бизнес-логики.
Существует 3 подвида:
1. Stateless - не хранит состояние бина.
2. Stateful - хранит состояние бина между вызовами для отдельного клиента. Пример, корзина в интернет-магазина.
3. Singleton - хранит состояние на протяжение работы всего приложение
2. message-driven bean - также бизнес-логика (JMS). Коммуникация между компонентами, использующими JMS, асинхронна (процедура не дожидается ответа на своё сообщение) и независима от исполнения компонентов. MDB - stateless.
EntityManager - API для CRUD
+ JPQL.
Встраивание POJO класса в сущность.
В качестве session bean может выступать обычный класс Java удовлетворяющий следующим условиям:
Компоненты EJB:
1. session bean - используется для описании бизнес-логики.
Существует 3 подвида:
1. Stateless - не хранит состояние бина.
2. Stateful - хранит состояние бина между вызовами для отдельного клиента. Пример, корзина в интернет-магазина.
3. Singleton - хранит состояние на протяжение работы всего приложение
2. message-driven bean - также бизнес-логика (JMS). Коммуникация между компонентами, использующими JMS, асинхронна (процедура не дожидается ответа на своё сообщение) и независима от исполнения компонентов. MDB - stateless.
JMS поддерживает две модели обмена сообщениями: «от пункта к пункту» и «издатель-подписчик».
Модель «от пункта к пункту» QUEUE (Point-to-Point) характеризуется следующим:
- Каждое сообщение имеет только одного получателя
- Сообщение попадает в «почтовый ящик», или «очередь» адресата и может быть прочитано когда угодно. Если адресат не работал в момент отсылки сообщения, сообщение не пропадёт.
- После получения сообщения получатель посылает извещение.
Модель «издатель-подписчик» TOPIC (Publish-subscribe) характеризуется следующим:
- Подписчик подписывается на определённую «тему»
- Издатель публикует своё сообщение. Его получают все подписчики этой темы
- Получатель должен работать и быть подписан в момент отправки сообщения
@MessageDriven(
//имя topic, на который подписан бин
mappedName="jms/TutorialTopic",
name = "ExampleMDB")
public class MDBExample implements MessageListener{
//метод, вызываемый при получении нового сообщения
@Override
public void onMessage(Message msg) {
try {
TextMessage message = (TextMessage)msg;
//считываем свойство из соответствующего поля, заданное вручную в consumer
System.out.println("FROM MDB - client type IS " + message.getStringProperty("clientType"));
//считываем само сообщение
System.out.println("FROM MDB - payload IS" + message.getText());
} catch (JMSException ex) {
ex.printStackTrace();
}
}
}
В onMessage метод добавляется необходимая бизнес логика, в зависимости от типа сообщения, его содержания и тд.
3. entities - для хранения данных. Pojo обьект промапленный таблицей.В onMessage метод добавляется необходимая бизнес логика, в зависимости от типа сообщения, его содержания и тд.
//mark it entity using Entity annotation //map table name using Table annoation @Entity @Table(name="books") public class Book implements Serializable{ private int id; private String name; public Book(){ } //mark id as primary key with autogenerated value //map database column id with id field @Id @GeneratedValue(strategy= GenerationType.IDENTITY) @Column(name="id") public int getId() { return id; } ...Используется вместе с JPA. Маппинг сущностей и отображение их в базе данных.
EntityManager - API для CRUD
@Stateless
public class LibraryPersistentBean implements LibraryPersistentBeanRemote { //pass persistence unit to entityManager. @PersistenceContext(unitName="EjbComponentPU") private EntityManager entityManager; public void addBook(Book book) { entityManager.persist(book); } public List<Book> getBooks() { return entityManager.createQuery("From Books").getResultList(); } ... }Persistence unit (persistence.xml) - свойства для перзистентности.
+ JPQL.
Встраивание POJO класса в сущность.
@Embeddable public class Publisher implements Serializable{ private String name; private String address; ... }
The above class can be embedded using @Embedded annotation
@Entity public class Book implements Serializable{ private int id; private String name; private Publisher publisher; ... @Embedded @AttributeOverrides({ @AttributeOverride(name = "name", column = @Column(name = "PUBLISHER")), @AttributeOverride(name = "address", column = @Column(name = "PUBLISHER_ADDRESS")) }) public Publisher getPublisher() { return publisher; } ... }
EAGER VS LAZY FETCH
public class University {
private String id;
private String name;
private String address;
private List<Student> students;
// setters and getters
}
Now when you load a University from the database, JPA loads its id, name, and address fields for you. But you have two options for students: to load it together with the rest of the fields (i.e. eagerly) or to load it on-demand (i.e. lazily) when you call the university's getStudents() method.
Пример JPQLpackage com.tutorialspoint.stateless; import com.tutorialspoint.entity.Book; import java.util.List; import javax.ejb.Stateless; import javax.persistence.EntityManager; import javax.persistence.PersistenceContext; import javax.persistence.Query; @Stateless public class LibraryPersistentBean implements LibraryPersistentBeanRemote { public LibraryPersistentBean(){ } @PersistenceContext(unitName="EntityEjbPU") private EntityManager entityManager; public void addBook(Book book) { entityManager.persist(book); } public List<Book> getBooks() { //create an ejbql expression String ejbQL = "From Book b where b.name like ?1"; //create query Query query = entityManager.createQuery(ejbQL); //substitute parameter. query.setParameter(1, "%test%"); //execute the query return query.getResultList(); } }Какие аннотации могут быть?
- Stateless - говорит контейнеру, что класс будет stateless session bean. Для него контейнер обеспечит безопасность потоков и менеджмент транзакций. Дополнительно, вы можете добавить другие свойства, например прозрачное управление безопасностью и перехватчики событий;
- Local - относится к интерфейсу и говорит, что bean реализующий интерфейс доступен локально (если в одной и той же среде JVM)
- Remote - относится к интерфейсу и говорит, что bean доступен через RMI (Remote Method Invocation) (в другой среде JVM)
- EJB - применятеся в коде, где мы используем bean.
- Stateful - говорит контейнеру, что класс будет stateful session bean.
- Entity - говорит контейнеру, что класс будет сущностью БД
- Table(name="...") - указывает таблицу для маппинга
- Id, Column - параметры маппинга
- WebService - говорит, что интерфейс или класс будет представлять вэб-сервис.
- и много-много других..
- @EJB - used to inject other EJB reference.
- @Resource - used to inject datasource or singleton services like sessionContext, timerService etc.
В качестве session bean может выступать обычный класс Java удовлетворяющий следующим условиям:
- иметь как минимум один метод
- не должен быть абстрактным
- иметь конструктор по-умолчанию
- методы не должны начинаться с "ejb" (например ejbCreate, ejbDoSomething)
Методы жизненного цикла EJB
У stateless и MDB бинов существует 2 события жизненного цикла, которые мы можем перехватить: создание и удаление бина. Метод, который будет вызываться сразу после создании бина помечается аннотацией javax.annotation.PostConstruct, а перед его удалением - javax.annotation.PreDestroy. Stateful бины обладают помимо рассмотреных выше еще 2 событиями: при активации (javax.ejb.PostActivate) и при деактивации (javax.ejb.PrePassivate).
Особенности stateless и stateful бинов
Контейнер помещает экземпляры stateless-бинов в общее хранилище и множество клиентов могут использовать один экземпляр бина. (пул обьектов бинов) В отличии от stateless stateful бины инстанцируются для каждого пользователя отдельно.
У stateless и MDB бинов существует 2 события жизненного цикла, которые мы можем перехватить: создание и удаление бина. Метод, который будет вызываться сразу после создании бина помечается аннотацией javax.annotation.PostConstruct, а перед его удалением - javax.annotation.PreDestroy. Stateful бины обладают помимо рассмотреных выше еще 2 событиями: при активации (javax.ejb.PostActivate) и при деактивации (javax.ejb.PrePassivate).
Особенности stateless и stateful бинов
Контейнер помещает экземпляры stateless-бинов в общее хранилище и множество клиентов могут использовать один экземпляр бина. (пул обьектов бинов) В отличии от stateless stateful бины инстанцируются для каждого пользователя отдельно.
Комментариев нет:
Отправить комментарий