Каков наилучший способ загрузки графа объектов Hibernate перед его использованием в пользовательском интерфейсе? - PullRequest
1 голос
/ 17 сентября 2008

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

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

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

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

Ответы [ 3 ]

2 голосов
/ 17 сентября 2008

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

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

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

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

1 голос
/ 18 сентября 2008

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

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

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

1 голос
/ 17 сентября 2008

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...