EJB 3.1 Транзакция, EntityManager - PullRequest
       26

EJB 3.1 Транзакция, EntityManager

0 голосов
/ 10 августа 2011

У меня есть приложение, которое обрабатывает IQ-строфы через smack (основанную на событиях библиотеку Java). Теперь мы переключаемся с Vanilla Tomcat на Glassfish 3.1, и я хотел бы перейти на EJB 3.1.

@Stateless
public class DispatchIQService {
    private static Logger log = Logger.getLogger(DispatchIQService.class);

    @PersistenceContext(unitName="hq")
    private EntityManager em;

    ....

    public void process(XMPPConnection connection, IQ rawRequest) {
    log.debug("Raw Provider IQ: " + rawRequest.toXML());

    RawResponse answer = null;

    try{
        StateWrapper state = new StateWrapper(em, connection, rawRequest);

        // parsing raw xml from request
        rawRequest.parse();
        // processing action
        answer = rawRequest.dispatchAction(state);

Из-за библиотеки событий я получаю правильный объект для каждого запроса. StateWrapper - это старая конструкция для передачи их, запроса и соединения через обработку сообщений. Я хочу удалить это как можно скорее с помощью ejbs и внедрения зависимостей.

С помощью rawRequest.dispatchAction (состояние) я передаю элемент управления объекту запроса для поиска службы фасада и начинаю с бизнес-логики.

@Override
public RawResponse dispatchAction(StateWrapper state) {
    ModelFacade modelFacade = Core.lookup(ModelFacade.class);
    return modelFacade.listModels(state, childElement.getIds());
}

Core.lookup просто выполняет поиск jndi для получения необходимого Бина. В этом бине я могу ввести их.

@Stateless
public class ModelFacade {

    @PersistenceContext(unitName="hq")
    private EntityManager em;

    ... 
public RsModelListIQ listModels(StateWrapper state, List<Long> list) { ...

Мой вопрос: работает ли этот em под той же транзакцией, что и em из DispatchIQService? Как я могу это проверить? Адрес их?

С наилучшими пожеланиями м

1 Ответ

1 голос
/ 11 августа 2011

Пока вы находитесь в одной транзакции, внедренный EntityManager в обоих случаях будет ссылаться на один и тот же "контекст транзакции JPA".Контейнеры обычно реализуют это, внедряя прокси-сервер EntityManager, который реализует каждый метод, просматривая контекст потока транзакции и затем повторно отправляя его в EntityManager для каждой транзакции.Вы можете проверить мое утверждение, выполнив обновление сущности в DispatchIQService, а затем запросив сущность в ModelFacade, чтобы убедиться, что обновление все еще там.

...