Веб-приложение с несколькими проектами, использующими Java EE и Hibernate - PullRequest
0 голосов
/ 16 июня 2011

У меня есть общий вопрос дизайна, который беспокоит меня в течение некоторого времени.

Цель:

  • Создание веб-приложения с использованием Vaadin для интерфейса пользователя
  • Пользователь должен иметь возможность создавать проекты во время выполнения.Каждый проект использует одну и ту же (доменную) модель, но разные данные
  • Данные для каждого проекта должны быть разделены (в разные базы данных)
  • Пользователь может войти в систему, выбрать проект и получить доступ к конкретной базе данных.
  • Разные пользователи могут работать над разными проектами одновременно
  • Приложение использует Hibernate с аннотациями и программной конфигурацией

Текущая ситуация

  • Статическое использование HibernateUtil во многих местах (getSessionFactory.getCurrentSession)
  • Частичная реализация шаблона Session-Per-View с ThreadLocal для получения текущего экземпляра приложения, который работает как Session- (и Transaction)Диспетчер с помощью HTTPServletRequestListener для открытия и закрытия сеанса и транзакции до и после запроса на просмотр
  • Логический слой без прямого доступа к View Layer:
    • В некоторых частях текущий сеанс получается с использованием статическогоHibernateUtil
    • в других местах, установив SМенеджер ession через конструктор.Затем этот диспетчер сеансов передается в DAO для обеспечения сеанса для получения данных манипуляцией
    • Когда проект создается, для создания базы данных используется опция создания Hibernates (в будущем это может быть переключено на статический импорт ddl).при создании)

Проблемы

Как можно себе представить, существуют различные проблемы:

  • Статический доступ к sessionfactory для получения сеанса не может работать для нескольких проектов, так как статический HibernateUtil может переносить только один (db) URL-адрес одновременно, и поэтому сессии смешиваются
  • Доступ к SessionManager из уровня логики не подходит (нужнопредоставить его через несколько конструкторов)
  • смесь разных подходов уродлива, но цель состоит в том, чтобы исправить это

Мысли

  • Внедрить внедрение зависимостей, чтобы обеспечить правильный DAOFactory даже на уровне логики.Пробовал с Guice, но получаю исключения Null Pointer, если экземпляры не создаются с помощью Injector (см. Мой другой вопрос).Поэтому это не работает.

Хотелось бы просто внедрить / использовать правильный экземпляр DAO Factory (у которого есть доступ к правильному сеансу / дБ) в любом месте кода без, например, логического уровня, который знает, какая текущая база данных загружена.Таким образом, логический уровень не должен заботиться об обработке сеанса или о чем-либо.Я просто хочу сделать вызов do xyDAO.find (id) или подобный из любого места, и он получает правильную базу данных.Я также думаю, что нехорошо передавать SessionManager через несколько классов конструктором, если в этом нуждается только один класс в глубине логики.

Какой подход вы бы использовали для достижения поставленных целей?

Буду очень признателен, если кто-нибудь сможет помочь.Если вам нужна дополнительная информация, пожалуйста, дайте мне знать, и я предоставлю!

1 Ответ

0 голосов
/ 16 июня 2011

Были ли у вас запутанные требования и решения?

Данные для каждого проекта должны быть разделены (на разные базы данных)

Есть ли действительно требование, чтобы у вас были разные базы данных, или просто Данные для каждого проекта должны быть разделены ?

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

Вы можете назвать этот подход разделением данных по вертикали , а не по горизонтали .

Выгода должна быть сразу очевидна: вдруг ваше решение становится намного проще, и это хорошо.

...