В чем разница между контекстом постоянства в области транзакций и контекстом расширенного постоянства? - PullRequest
40 голосов
/ 30 марта 2010

В чем разница между контекстом постоянства в области транзакций и контекстом расширенного постоянства ??

Ответы [ 3 ]

44 голосов
/ 31 марта 2010

Различие четко объяснено в спецификации JSR-220 Enterprise JavaBeans 3.0:

5.6 Контексты управляемости контейнером

(...)

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

(...)

5.6.1 Контекст сохраняемости в управляемой контейнером транзакции

Приложение может получить Управляемый контейнером объект менеджер с контекст персистентности в области транзакций связан с транзакцией JTA инъекция или прямой поиск в JNDI Пространство имен. Постоянный контекст Тип для менеджера объекта по умолчанию или определяется как PersistenceContextType.TRANSACTION.

Новый контекст постоянства начинается, когда менеджер сущностей, управляемый контейнером вызывается [36] в области видимости активной транзакции JTA и в настоящее время нет настойчивости контекст уже связан с JTA транзакция. Постоянство контекст создается и затем ассоциируется с транзакцией JTA.

Контекст постоянства заканчивается, когда связанная транзакция JTA фиксирует или откатывается и все сущности которые были управляется EntityManager стать отсоединена.

Если вызывается менеджер сущностей вне рамок сделки, любые объекты, загруженные из базы данных немедленно оторвется от конец вызова метода.

5.6.2 Расширенный контекст сохраняемости, управляемый контейнером

расширенный контейнер постоянный контекст может быть только инициировано в рамках сессионный компонент. Существует от точка, в которой государство сессионный компонент, который объявляет зависимость от менеджера объекта тип PersistenceContextType.EXTENDED создан и, как говорят, связан с сессионный компонент с состоянием. зависимость от расширенной настойчивости контекст объявляется с помощью PersistenceContext аннотация или развертывание персистентного контекста элемент дескриптора.

Контекст постоянства закрыт контейнер при @Remove метод сессионного компонента с сохранением состояния завершается (или сеанс с сохранением состояния в противном случае экземпляр компонента уничтожается).

(...)

7 голосов
/ 05 января 2016

Есть много деталей, которые нужно уважать ... но, говоря кратко, я помню разницу вот так:

Контекст устойчивости транзакции

Вкратце: Когда вызывается метод для bean-объекта в области транзакций, контейнер автоматически запускает транзакцию и создает для вас новый контекст постоянства. Когда метод завершается, транзакции завершаются и контекст постоянства будет закрыт, ваши сущности станут отсоединенными.

Преимущество: Это поведение не требует сохранения состояния, не требует особого сопровождения кода и делает ваш EntityManager поточно-ориентированным.

Расширенный контекст постоянства

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

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

Важные вещи, которые нужно знать

Распространение транзакции: Предполагается, что по умолчанию TransactionAttributes для bean-объекта в области транзакции с двумя методами A и B.

Если метод B вызывается внутри метода A, вы можете распространить контекст постоянства A на B. Таким образом, метод B может получить доступ даже к еще не сохраненным объектам, которые были созданы / изменены A, поскольку они все еще управляются контекстом постоянства. на котором B теперь имеет доступ.

Распространение транзакции из расширено до области транзакции : Вы можете распространить контекст персистентности расширенного компонента в компонент транзакции, вызвав метод вашего компонента в области транзакции от вашего расширенного боба. С атрибутом транзакции по умолчанию (REQUIRED) ваш bean-объект в области транзакции будет повторно использовать уже существующий активный контекст персистентности вашего расширенного bean-компонента.

Распространение транзакции от в области транзакций к расширенному : Однако обратный путь не так интуитивен, поскольку расширенный контекст постоянства всегда пытается сделать себя активным контекстом постоянства. Вы должны изменить атрибут транзакции по умолчанию для расширенного компонента, используя @TransactionAttribute(TransactionAttributeType.REQUIRES_NEW). Это приостановит любую активную транзакцию (связанную с контекстом постоянства) до запуска метода расширенного компонента.

5 голосов
/ 02 июля 2013

Контекст персистентности в области транзакции

Как следует из названия, контекст персистентности в области транзакций привязан к жизненному циклу сделка. Он создается контейнером во время транзакции и будет закрыт при транзакции завершается.

Менеджеры сущности в области транзакции отвечают за создание области транзакции постоянство контексты автоматически при необходимости. Мы говорим только тогда, когда это необходимо, потому что транзакции создание контекста постоянства лениво.

Менеджер сущностей создаст только постоянный контекст когда метод вызывается в менеджере сущностей и когда нет постоянного контекста.

Расширенные контексты персистентности

Жизненный цикл расширенного контекста персистентности привязан к сессионному компоненту с состоянием, к которому он привязан.

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

Сессионный компонент с сохранением состояния связан с одним расширенным контекстом постоянства, который создается при создании экземпляра компонента и закрывается при удалении экземпляра компонента. Это имеет последствия для характеристик ассоциации и распространения расширенной персистентности контекст.

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