Работа с JDBC в EJB-Hibernate env - PullRequest
       36

Работа с JDBC в EJB-Hibernate env

1 голос
/ 05 марта 2011

У меня небольшая путаница в отношении соединения JDBC, транзакций и их интеграции в среду EJB, JTA, Hibernate. Мои сомнения:

  1. когда мы используем @Resource DataSource ds; ... ds.getConnection (), мы работаем в той же транзакции, что и управляемый компонент? Должны ли мы закрыть соединение, оператор, набор результатов?

  2. как насчет session.doWork? Мы в одной транзакции? Как насчет закрытия заявления и набора результатов?

  3. Режим агрессивного выпуска в Hibernate означает, что соединения закрываются после каждого оператора. Значит ли это, что транзакция тоже совершена? (Я не думаю, что это правда, но я не могу понять, как здесь работает Hibernate)

1 Ответ

0 голосов
/ 05 марта 2011

Есть несколько вещей, которые нужно выяснить.Прежде всего вам необходимо определить, какая у вас единица работы.Шаблон сеанса для запроса является одним из наиболее используемых, и если у вас нет особых потребностей, придерживайтесь этого.Если вы используете Hibernate, вы не используете операторы и наборы результатов напрямую.Hibernate сделает это за вас.что вам нужно закрыть - это сеанс гибернации

, который вы используете - это SessionFactory и объект Session.Сессия в значительной степени представляет вашу единицу работы.В спящем режиме вы получаете свои объекты, меняете их и сохраняете обратно.Сеанс для шаблона запроса открывает сеанс при получении запроса и закрывает его при отправке ответа.

В управляемом контейнером сеансовом компоненте EJB доступна транзакция и источник данных, который вы (или спящий) используете втакой контейнер автоматически обрабатывается JTA TransactionManager.

Теперь, поскольку Hibernate умен, он может автоматически привязывать «текущий» сеанс к текущей транзакции JTA.Это позволяет легко реализовать стратегию сеанса для запроса с помощью метода getCurrentSession () в вашем SessionFactory:

try {
    UserTransaction tx = (UserTransaction)new InitialContext()
                            .lookup("java:comp/UserTransaction");

    tx.begin();

    // Do some work
    factory.getCurrentSession().load(...);
    factory.getCurrentSession().persist(...);

    tx.commit();
}
catch (RuntimeException e) {
    tx.rollback();
    throw e; // or display error message
}

Итак, чтобы ответить на ваши вопросы:

Если вы используете Hibernate сJTA в контейнере, вам лучше использовать JPA EntityManager или, возможно, весенний спящий шаблон.

Вот несколько ссылок: http://community.jboss.org/wiki/sessionsandtransactions#Transaction_demarcation_with_JTA http://static.springsource.org/spring/docs/2.5.x/api/org/springframework/orm/hibernate3/HibernateTemplate.html

...