В чем разница между контекстом Persistence с областью действия и контекстом Extended Persistence?

В чем разница между контекстом Persistence с областью действия транзакций и контекстом Extended Persistence?

Ответ 1

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

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

(...)

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

(...)

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

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

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

Контекст persistence заканчивается, когда связанная транзакция JTA совершает или откатывается назад, и все объекты, которые были управляемый EntityManager, становится удаленные.

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

5.6.2 Контекст с постоянным содержанием, управляемый контейнером

Расширенное управление контейнером контекст постоянства может быть инициированный в рамках сеанс с состоянием bean. Оно существует из момент, когда состояние session bean, который объявляет зависимости от менеджера объекта тип PersistenceContextType.EXTENDEDсоздается и, как говорят, сеанс с состоянием bean. зависимость от продолжительного настойчивости контекст объявляется посредством PersistenceContext аннотация или развертывание persistence-context-ref дескриптор.

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

(...)

Ответ 2

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

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

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

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

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

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

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

Важные вещи, чтобы знать

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

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

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

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

Ответ 3

Контекст сохранения контекста с транзакциями

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

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

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

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

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

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

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