Как лучше всего загрузить граф объектов Hibernate перед его использованием в пользовательском интерфейсе?

StackOverflow https://stackoverflow.com/questions/79843

  •  09-06-2019
  •  | 
  •  

Вопрос

Ситуация такова:

  • У вас есть контекст Hibernate с графом объекта, который имеет определенную ленивую нагрузку.
  • Вы хотите использовать объекты Hibernate в вашем пользовательском интерфейсе, как есть без необходимости копировать данные где -то.
  • Существуют разные контексты пользовательского интерфейса, которые требуют разных объемов данных.
  • Данные слишком велики, чтобы просто стремиться к загрузке всего графика каждый раз.

Как лучше всего загрузить все соответствующие объекты в граф объектов настраиваемым способом, чтобы к ним можно было получить доступ без необходимости возвращаться в базу данных для загрузки дополнительных данных?

Любая помощь.

Это было полезно?

Решение

Допустим, у вас есть Клиент и в какой-то момент вам нужно что-то сделать с его Ордерами и, возможно, у него есть Бонус за его Ордера.

Затем я бы определил репозиторий с гибким интерфейсом, который позволит мне сказать что-то вроде:

new ClientRepo().LoadClientBy(id)
                .WithOrders()
                .WithBonus()
                .OrderByName();

И вот у вас есть клиент со всем необходимым.Желательно заранее знать, что вам понадобится для текущей операции.Таким образом, вы можете избежать нежелательных обращений к базе данных (новые разработчики в вашей команде обычно делают это - вызывают свойство и не осознают тот факт, что на самом деле это вызов БД).

Другие советы

Если это веб-приложение и вы используете Spring, то OpenSessionInViewFilter может стать решением ваших проблем.

Подход, который мы используем в наших проектах, заключается в создании сервиса для каждого вашего представления.Затем представление извлекает подграф, необходимый для этого конкретного представления, всегда пытаясь уменьшить количество запросов SQL, отправляемых в базу данных.Поэтому мы используем множество соединений для получения связанных объектов n:1.

Если вы используете двухуровневое настольное приложение, напрямую подключенное к БД, вы можете просто оставить объекты прикрепленными и автоматически загружать дополнительные данные в любое время.В противном случае вам придется повторно подключить его к сеансу и инициализировать нужную вам ассоциацию с помощью Hibernate.initialize(Object entity, String propertyName)

(Недостаточно памяти, возможно, не на 100% верно)

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top