Внедрение менеджера сущностей в SFSB с помощью Seam - PullRequest
2 голосов
/ 02 марта 2011

Я создаю веб-приложение, используя Seam, используя EJB с сохранением состояния в качестве бизнес-компонентов (также аннотированных как компоненты Seam).В этом сценарии, какова лучшая практика для внедрения менеджера сущностей, используя @In или @PersistenceContext?один из двух вариантов вызовет у меня проблемы?(предположим, что длительность разговора и связанный с ним контекст постоянства не являются проблемой)

Если я решу использовать @In и мне потребуется пометить метод как не транзакционный, следует ли мне использовать @Transactional (TransactionPropagationType.SUPPORTS) или @TransactionAttribute (TransactionAttributeType.SUPPORTS)?

1 Ответ

2 голосов
/ 03 марта 2011

У вас не возникнет никаких проблем с использованием контекста управляемой сохраняемости 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 книги Дэна Аллена «Шов в действии» удовлетворит любые сомнения по этой теме.

...