У вас не возникнет никаких проблем с использованием контекста управляемой сохраняемости Seam вместо стандартного контекста управляемой сохраняемости контейнеров, поэтому, на мой взгляд, рекомендуется использовать @In
.Среди преимуществ использования контекста персистентности, управляемого Seam:
- Вы можете внедрить тот же контекст персистентности в компоненте не-EJB Seam
- Использование
<s:convertEntity>
в представлении (при условии, что вы собираетесь использовать JSF) - Использование EL на языке запросов
- У вас есть постоянный контекст, связанный с контекстом разговора (не важно для вас, если вы правильно понимаете)
Если вы выберете @In
, то есть контекст персистентности, управляемой Seam, тогда вы можете провести декларативное разграничение транзакций, используя @Transactional
в компоненте Seam, отличном от EJB, где @TransactionAttribute
не имеет смысла.Для сессионного компонента EJB, аннотированного как компонент Seam (@Name
) * следует использовать @TransactionAttribute
с той же семантикой, что и для EJB3.
Поскольку @Transactional
не имеет значения REQUIRES_NEW
, применяется следующеекак объяснено в справочной документации:
Если вы используете EJB3 и отмечаете свой класс или метод @TransactionAttribute(REQUIRES_NEW)
, то контекст транзакции и персистентности не должен распространяться на вызовы методов для этого объекта.Однако, поскольку управляемый швом контекст постоянства распространяется на любой компонент в диалоге, он будет распространяться на методы, помеченные REQUIRES_NEW
.Поэтому, если вы пометите метод REQUIRES_NEW
, вам следует обратиться к менеджеру сущностей с помощью @PersistenceContext
.
Глава 9 книги Дэна Аллена «Шов в действии» удовлетворит любые сомнения по этой теме.