Есть много деталей, которые нужно уважать ... но, говоря кратко, я помню разницу вот так:
Контекст устойчивости транзакции
Вкратце: Когда вызывается метод для bean-объекта в области транзакций, контейнер автоматически запускает транзакцию и создает для вас новый контекст постоянства. Когда метод завершается, транзакции завершаются и контекст постоянства будет закрыт, ваши сущности станут отсоединенными.
Преимущество: Это поведение не требует сохранения состояния, не требует особого сопровождения кода и делает ваш EntityManager поточно-ориентированным.
Расширенный контекст постоянства
Вкратце: Может использоваться только для сессионного компонента с сохранением состояния и привязан к жизненному циклу компонента. Контекст постоянства может появляться в нескольких транзакциях, что означает, что методы в вашем расширенном компоненте используют один и тот же контекст постоянства.
Преимущество: Идеально подходит для реализации стиля общения с клиентами. Ваш клиент вызывает несколько методов bean-компонента, чтобы сообщить вашему bean-компоненту всю информацию, которую вам нужно знать, и в конце разговора вы сохраняете все в свою БД.
Важные вещи, которые нужно знать
Распространение транзакции: Предполагается, что по умолчанию TransactionAttributes для bean-объекта в области транзакции с двумя методами A и B.
Если метод B вызывается внутри метода A, вы можете распространить контекст постоянства A на B. Таким образом, метод B может получить доступ даже к еще не сохраненным объектам, которые были созданы / изменены A, поскольку они все еще управляются контекстом постоянства. на котором B теперь имеет доступ.
Распространение транзакции из расширено до области транзакции : Вы можете распространить контекст персистентности расширенного компонента в компонент транзакции, вызвав метод вашего компонента в области транзакции от вашего расширенного боба. С атрибутом транзакции по умолчанию (REQUIRED
) ваш bean-объект в области транзакции будет повторно использовать уже существующий активный контекст персистентности вашего расширенного bean-компонента.
Распространение транзакции от в области транзакций к расширенному : Однако обратный путь не так интуитивен, поскольку расширенный контекст постоянства всегда пытается сделать себя активным контекстом постоянства. Вы должны изменить атрибут транзакции по умолчанию для расширенного компонента, используя @TransactionAttribute(TransactionAttributeType.REQUIRES_NEW)
. Это приостановит любую активную транзакцию (связанную с контекстом постоянства) до запуска метода расширенного компонента.