В чем разница между контекстом персистентности в области транзакций и контекстом расширенной персистентности?
В чем разница между контекстом постоянства в области транзакций и контекстом расширенного постоянства??
3 ответа
Различие четко объяснено в спецификации 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
элемент дескриптора развертывания аннотации или persistence-context-ref.Контекст постоянства закрывается контейнером, когда
@Remove
метод сессионного компонента с сохранением состояния завершается (или иным образом экземпляр сессионного компонента с состоянием уничтожается).(...)
Есть много деталей, которые нужно уважать... но, говоря кратко, я помню разницу вот так:
Контекст сохраняемости транзакции
Вкратце: когда вызывается метод для bean-объекта в области транзакций, контейнер автоматически запускает транзакцию и для вас создается новый контекст постоянства. Когда метод завершается, транзакции заканчиваются и контекст постоянства будет закрыт, ваши сущности станут отсоединенными.
Преимущество: это поведение без сохранения состояния, не требует особого сопровождения кода и делает ваш EntityManager поточно-ориентированным.
Расширенный постоянный контекст
Вкратце: может использоваться только для сессионного компонента с сохранением состояния и привязан к жизненному циклу компонента. Контекст постоянства может появляться в нескольких транзакциях, что означает, что методы в вашем расширенном компоненте используют один и тот же контекст постоянства.
Преимущество: идеально подходит для реализации стиля общения с клиентами. Ваш клиент вызывает несколько методов bean-компонента, чтобы сообщить вашему bean-компоненту всю информацию, которую вам нужно знать, и в конце разговора вы сохраняете все в свою БД.
Важные вещи, которые нужно знать
Распространение транзакции: Предполагается, что TransactionAttributes по умолчанию для bean-объекта в области транзакции с двумя методами A и B.
Если метод B вызывается внутри метода A, вы можете распространить контекст постоянства A на B. Таким образом, метод B может получить доступ даже к еще не сохраненным объектам, которые были созданы / изменены A, потому что они все еще управляются контекстом постоянства, на котором B теперь имеет доступ к.
Распространение транзакции из расширенного в область транзакции: вы можете распространить контекст персистентности расширенного компонента на компонент транзакции, вызвав метод вашего компонента в транзакции из расширенного компонента. С атрибутом транзакции по умолчанию (REQUIRED
) ваш bean-объект в области транзакций будет повторно использовать уже существующий активный контекст персистентности вашего расширенного bean-компонента.
Распространение транзакции из области транзакции в расширенную. Однако обратный путь не так интуитивен, поскольку расширенный контекст постоянства всегда пытается сделать себя активным контекстом постоянства. Вы должны изменить атрибут транзакции по умолчанию для расширенного компонента, используя @TransactionAttribute(TransactionAttributeType.REQUIRES_NEW)
, Это приостановит любую активную транзакцию (связанную с контекстом постоянства) до запуска метода расширенного компонента.
Контекст сохранения транзакции
Как следует из названия, контекст персистентности в области транзакции связан с жизненным циклом транзакции. Он создается контейнером во время транзакции и будет закрыт по завершении транзакции.
Менеджеры сущностей в области транзакций отвечают за автоматическое создание контекстов персистентности в области транзакций при необходимости. Мы говорим только тогда, когда это необходимо, потому что создание контекста персистентной транзакции лениво.
Менеджер сущностей создаст контекст постоянства только тогда, когда метод вызывается на менеджере сущностей и когда нет доступного контекста.
Расширенные контексты постоянства
Жизненный цикл расширенного контекста персистентности связан с компонентом сеанса с сохранением состояния, с которым он связан.
В отличие от диспетчера сущностей в области транзакций, который создает новый контекст постоянства для каждой транзакции, расширенный диспетчер сущностей сессионного компонента с состоянием всегда использует один и тот же контекст постоянства.
Сессионный компонент с состоянием связан с одним расширенным контекстом персистентности, который создается при создании экземпляра компонента и закрывается при удалении экземпляра компонента. Это имеет значение как для характеристик ассоциации, так и для распространения в расширенном контексте постоянства.
@PersistenceContext(type = PersistenceContextType.TRANSACTION)
Если мы просто напишем @PersistenceContext
это так же хорошо, как написать вышеупомянутое заявление. Смысл этого в том, чтобы быстро сбросить (сохранить) изменения в БД.
@PersistenceContext(type = PersistenceContextType.EXTENDED)
Вот это значит не жадностью вровень (сохранить) изменения в БД, а не ждать следующего активного сделки, чтобы начать или ждать, пока волевой совершить огонь
Взгляните на https://www.byteslounge.com/tutorials/jpa-extended-persistence-context