Читаем Изучаем Java EE 7 полностью

Как вы только что видели, CMT — одна из оригинальных и простых в применении функций EJB. При использовании декларативных транзакций для классов или методов корпоративного компонента контейнер может создавать новые транзакции (REQUIRED, REQUIRES_NEW), наследовать из уже существующих (SUPPORTS) или генерировать исключение, если транзакция не была создана заранее (MANDATORY). Это происходит потому, что контейнер перехватывает соответствующий вызов метода и добавляет операции, необходимые для инициализации, приостановки или завершения транзакций JTA.

Как часть лучшего согласования Managed Beans с платформой, одним из усовершенствований Java EE 7 является расширение СМТ за рамки EJB. Это стало возможным благодаря перехватчикам и их связыванию (см. главу 2). Управление транзакциями в Managed Beans реализовано с использованием связывания перехватчиков CDI, как это показано в листинге 9.7.


Листинг 9.7. Связывание перехватчиков @javax.transaction.Transactional

@Inherited

@InterceptorBinding

@Target({TYPE, METHOD})

@Retention(RUNTIME)

public @interface Transactional {


··TxType value() default TxType.REQUIRED;

··Class[] rollbackOn() default {};

··Class[] dontRollbackOn() default {};

··public enum TxType {

····REQUIRED,

····REQUIRES_NEW,

····MANDATORY,

····SUPPORTS,

····NOT_SUPPORTED,

····NEVER

··}

}

Аннотация javax.transaction.Transactional (см. листинг 9.7) предоставляет приложению возможность декларативно контролировать границы транзакций в CDI Managed Beans, а также сервлетов, JAX-RS и конечных точек JAX-WS. Это обеспечивает семантику атрибутов транзакций EJB в CDI без зависимостей от других служб EJB, таких как RMI или службы таймера.

Например, в листинге 9.8 показана веб-служба JAX-RS (подробнее об этом читайте в главе 15), использующая аннотацию @Transactional, для того чтобы применять класс EntityManager для сохранения книг в базе данных. Такой код нельзя было написать до появления Java EE 7. Нужно было либо аннотировать веб-службу RESTful @Stateless, либо делегировать уровни хранения сессионного компонента.


Листинг 9.8. Веб-служба RESTful, предназначенная для создания книг с помощью транзакций

@Path("book")

@Transactional

public class BookRestService {

··@Context

··private UriInfo uriInfo;

··@PersistenceContext(unitName = "chapter09PU")

··private EntityManager em;

··@POST

··@Consumes(MediaType.APPLICATION_XML)

··public Response createBook(Book book) {

····em.persist(book);

····URI bookUri = uriInfo.getAbsolutePathBuilder(). path(book.getId(). toString()). build();

····return Response.created(bookUri). build();

··}

··@GET

··@Produces(MediaType.APPLICATION_XML)

··@Transactional(Transactional.TxType.SUPPORTS)

··public Books getAllBooks() {

····TypedQuery query = em.createNamedQuery(Book.FIND_ALL, Book.class);

····Books books = new Books(query.getResultList());

····return books;

··}

}

Вы также можете изменить настройки транзакций политики по умолчанию (например, SUPPORTS) только с помощью атрибутов аннотации. Как показано в листинге 9.8, аннотацию @Transactional можно применить только для класса и/или метода.

Исключения и транзакции. Исключения и транзакции в Managed Beans немного отличаются от их аналогов в EJB. Как и в EJB, они используют такую же обработку исключений по умолчанию: исключения приложения (то есть проверяемые исключения) приводят к тому, что перехватчик не помечает транзакцию для отката, а для системных исключений (непроверяемых исключений) это выполняется. Но такое поведение по умолчанию может быть перегружено с помощью аннотации @Transactional с атрибутами rollbackOn и dontRollbackOn. Когда вы определяете класс для любого из этих атрибутов, разработанное поведение применяется и к подклассам этого класса. Если вы укажете оба атрибута, то dontRollbackOn будет иметь приоритет.

Перейти на страницу:

Похожие книги

C# 4.0: полное руководство
C# 4.0: полное руководство

В этом полном руководстве по C# 4.0 - языку программирования, разработанному специально для среды .NET, - детально рассмотрены все основные средства языка: типы данных, операторы, управляющие операторы, классы, интерфейсы, методы, делегаты, индексаторы, события, указатели, обобщения, коллекции, основные библиотеки классов, средства многопоточного программирования и директивы препроцессора. Подробно описаны новые возможности C#, в том числе PLINQ, библиотека TPL, динамический тип данных, а также именованные и необязательные аргументы. Это справочное пособие снабжено массой полезных советов авторитетного автора и сотнями примеров программ с комментариями, благодаря которым они становятся понятными любому читателю независимо от уровня его подготовки. Книга рассчитана на широкий круг читателей, интересующихся программированием на C#.Введите сюда краткую аннотацию

Герберт Шилдт

Программирование, программы, базы данных
97 этюдов для архитекторов программных систем
97 этюдов для архитекторов программных систем

Успешная карьера архитектора программного обеспечения требует хорошего владения как технической, так и деловой сторонами вопросов, связанных с проектированием архитектуры. В этой необычной книге ведущие архитекторы ПО со всего света обсуждают важные принципы разработки, выходящие далеко за пределы чисто технических вопросов.?Архитектор ПО выполняет роль посредника между командой разработчиков и бизнес-руководством компании, поэтому чтобы добиться успеха в этой профессии, необходимо не только овладеть различными технологиями, но и обеспечить работу над проектом в соответствии с бизнес-целями. В книге более 50 архитекторов рассказывают о том, что считают самым важным в своей работе, дают советы, как организовать общение с другими участниками проекта, как снизить сложность архитектуры, как оказывать поддержку разработчикам. Они щедро делятся множеством полезных идей и приемов, которые вынесли из своего многолетнего опыта. Авторы надеются, что книга станет источником вдохновения и руководством к действию для многих профессиональных программистов.

Билл де Ора , Майкл Хайгард , Нил Форд

Программирование, программы, базы данных / Базы данных / Программирование / Книги по IT