EJB и Hibernate в приложении Struts - PullRequest
3 голосов
/ 09 ноября 2010

У меня есть приложение, в котором есть комбинация стоек 1.1 и EJB 2, но теперь мы вводим в нее новый кусок с Hibernate 3.2.DAO в спящем режиме работает параллельно с DAO сессионного компонента EJB 2 с чистым JDBC.Я обеспокоен управлением соединениями jdbc в этом случае.Начиная с EJB 2.0 есть управляемые контейнером соединения и транзакции.Но в случае гибернации мы начинаем и фиксируем транзакцию гибернации. Будет ли безопасно предполагать, что с этой архитектурой не будет никаких проблем?

Нужна помощь в анализе.

PM


Я размышлял над той же проблемой, если модуль гибернации, который может получить доступ к существующим таблицам, используется JDBC DAO, транзакция которого управляется сессионными компонентами.Но вот мой подход:

  1. У меня будет делегат, который вызывает сессионный EJB-компонент, и, поскольку этот бин будет отвечать за управление транзакциями, я буду создавать свои спящие DAO и вызывать ихиз этого сеанса bean, который, как я предполагаю, не будет иметь никаких проблем.

  2. Фабрика сеанса гибернации для этого приложения будет создана один раз с использованием плагина гибернации, который будет частью XML-конфигурации Struts и будет сохранен как часть контекста сервлета, а затем будет выполнено действие.класс будет передавать этот экземпляр сеанса из делегата EJB-сеанса в спящий режим DAO.

  3. Я полагаю, что это будет чистый подход, поскольку транзакция будет управляться сессионным EJB-компонентом, которыйразвернуты на веб-сфере.Управление пулами соединений JDBC, поскольку оно настроено на веб-сфере и доступно с использованием источников данных, hibernate не должен беспокоиться об этом.

Пожалуйста, помогите мне, если я нахожусь на правильном пути смои предположения?

Ответы [ 3 ]

0 голосов
/ 10 ноября 2010

Hibernate можно без проблем использовать с сеансными компонентами CMT (или BMT), совместно использовать пул соединений с кодом JDBC и участвовать в той же транзакции.

См. Весь раздел 11.2.Разграничение транзакций базы данных и, в частности, 11.2.2.Использование JTA .

Что непонятно, так это то, что модуль Hibernate будет «изолирован» от сущностей, управляемых через JDBC.Если вы будете получать доступ к одним и тем же таблицам через оба API, вам придется принять некоторые меры предосторожности:

  • не ожидайте смешивать объекты JDBC в графе объектов Hibernate (хотя возможно и обратное).
  • уважать и имитировать стратегию оптимистического параллелизма Hibernate при обновлении строк через JDBC
  • в обход API Hibernate не будет запускать обновление кэша (если вы используете кэш 2-го уровня), в этом случаеВы должны были бы вызвать это самостоятельно.
0 голосов
/ 06 декабря 2010

Вот одно из возможных решений

Общий источник данных JNDI, который будет использоваться как в EJB, так и в Hibernate.

0 голосов
/ 09 ноября 2010

Транзакции разграничивают логическую единицу работы и, следовательно, по своей сути изолированы.Но мне интересно, зачем вам нужно сочетание обоих.Если вы уже используете EJB2 + JDBC, почему бы не придерживаться этого?

...