Как лучше всего загрузить граф объектов Hibernate перед его использованием в пользовательском интерфейсе?
Вопрос
Ситуация такова:
- У вас есть контекст Hibernate с графом объекта, который имеет определенную ленивую нагрузку.
- Вы хотите использовать объекты Hibernate в вашем пользовательском интерфейсе, как есть без необходимости копировать данные где -то.
- Существуют разные контексты пользовательского интерфейса, которые требуют разных объемов данных.
- Данные слишком велики, чтобы просто стремиться к загрузке всего графика каждый раз.
Как лучше всего загрузить все соответствующие объекты в граф объектов настраиваемым способом, чтобы к ним можно было получить доступ без необходимости возвращаться в базу данных для загрузки дополнительных данных?
Любая помощь.
Решение
Допустим, у вас есть Клиент и в какой-то момент вам нужно что-то сделать с его Ордерами и, возможно, у него есть Бонус за его Ордера.
Затем я бы определил репозиторий с гибким интерфейсом, который позволит мне сказать что-то вроде:
new ClientRepo().LoadClientBy(id)
.WithOrders()
.WithBonus()
.OrderByName();
И вот у вас есть клиент со всем необходимым.Желательно заранее знать, что вам понадобится для текущей операции.Таким образом, вы можете избежать нежелательных обращений к базе данных (новые разработчики в вашей команде обычно делают это - вызывают свойство и не осознают тот факт, что на самом деле это вызов БД).
Другие советы
Если это веб-приложение и вы используете Spring, то OpenSessionInViewFilter может стать решением ваших проблем.
Подход, который мы используем в наших проектах, заключается в создании сервиса для каждого вашего представления.Затем представление извлекает подграф, необходимый для этого конкретного представления, всегда пытаясь уменьшить количество запросов SQL, отправляемых в базу данных.Поэтому мы используем множество соединений для получения связанных объектов n:1.
Если вы используете двухуровневое настольное приложение, напрямую подключенное к БД, вы можете просто оставить объекты прикрепленными и автоматически загружать дополнительные данные в любое время.В противном случае вам придется повторно подключить его к сеансу и инициализировать нужную вам ассоциацию с помощью Hibernate.initialize(Object entity, String propertyName)
(Недостаточно памяти, возможно, не на 100% верно)