Как инициализировать объекты Hibernate, извлеченные удаленным вызовом метода? - PullRequest
6 голосов
/ 23 сентября 2008

При вызове удаленной службы (например, через RMI) для загрузки списка сущностей из базы данных с использованием Hibernate, как вы управляете им для инициализации всех полей и ссылок, необходимых клиенту?

Пример: клиент вызывает удаленный метод для загрузки всех клиентов. С каждым клиентом клиент хочет инициализировать ссылку на список покупаемых товаров.

Я могу представить себе следующие решения:

  1. Напишите удаленный метод для каждого специального запроса, который инициализирует обязательные поля (например, Hibernate.initialize ()) и возвращает объекты домена клиенту.

  2. Как и 1., но создавать DTO

  3. Разделить запрос на несколько запросов, например, один для клиентов, второй для статей клиентов, и пусть клиент управляет результатами

  4. Удаленный метод принимает DetachedCriteria, который создается клиентом и выполняется сервером

  5. Разработка пользовательского шаблона предварительной загрузки, то есть способ, позволяющий клиенту явно указывать, какие свойства следует предварительно загрузить.

Ответы [ 5 ]

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

Я был у клиента, который стандартизировал свои проекты на # 5, и он работал очень хорошо. Последним аргументом вызова службы был список всех свойств, которые должны быть загружены, через запятую, например:

CustomerService.getCustomerById(id, "parent, address, address.city")

Я полагаю, что для этого они использовали предложение fetch. Я реализовал ту же идею один раз для jpa, используя PropertyUtils для запуска отложенной загрузки.

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

Я думаю, что номер 5 - это то, почему в HQL есть предложение «fetch». Не могли бы вы использовать это или проблема более сложная?

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

Я использовал 1 в прошлом, и он работал хорошо.

0 голосов
/ 23 сентября 2008

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

Лично я считаю, что DTO - верный путь. Выражая свой удаленный интерфейс в терминах DTO, вы уверены, что получите все, что вам нужно, и ничего, чего вы не ожидали.

0 голосов
/ 23 сентября 2008

Этот удаленный сервис ... это еще одна часть того же приложения? если это так, то нет проблем с совместным использованием классов и отправкой экземпляров туда и обратно (то же самое относится и к RMI, используя заглушки).

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

В любом случае, мой голос за DTO. Я думаю, что они предоставляют лучшее и простое решение, где это применимо, и помогают сохранить код простым и понятным.

Юваль = 8 -)

...