У меня есть общий вопрос дизайна, который беспокоит меня в течение некоторого времени.
Цель:
- Создание веб-приложения с использованием 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 через несколько классов конструктором, если в этом нуждается только один класс в глубине логики.
Какой подход вы бы использовали для достижения поставленных целей?
Буду очень признателен, если кто-нибудь сможет помочь.Если вам нужна дополнительная информация, пожалуйста, дайте мне знать, и я предоставлю!