Как инициализировать объекты Hibernate, полученные с помощью удаленного вызова метода?
Вопрос
При вызове удаленной службы (например.через RMI), чтобы загрузить список сущностей из базы данных с помощью Hibernate, как вам удается инициализировать все поля и ссылки, необходимые клиенту?
Пример:Клиент вызывает удаленный метод для загрузки всех клиентов.При каждом покупателе клиент хочет, чтобы была инициализирована ссылка на список купленных покупателем товаров.
Я могу представить себе следующие решения:
Напишите удаленный метод для каждого специального запроса, который инициализирует необходимые поля (например,Hibernate.initialize()) и возвращает объекты домена клиенту.
Нравится 1.но создайте DTO
Разделите запрос на несколько запросов, например.один для клиентов, второй для статей клиентов и позвольте клиенту управлять результатами
Удаленный метод принимает DetachedCriteria, который создается клиентом и выполняется сервером.
Разработать собственный «Шаблон предварительной загрузки», т.е.способ для клиента явно указать, какие свойства предварительно загружать.
Решение
Раньше я использовал 1, и он работал хорошо.
Другие советы
Я думаю, что номер 5 объясняет, почему в HQL есть пункт «выборка».Не могли бы вы использовать это или проблема более сложная?
Я был у клиента, который стандартизировал свои проекты на №5, и это сработало очень хорошо.Последним аргументом вызова службы был список всех загружаемых свойств, разделенных запятыми, например:
CustomerService.getCustomerById(id, "parent, address, address.city")
Я считаю, что для этого они использовали пункт fetch.Однажды я реализовал ту же идею для jpa, используя PropertyUtils для запуска отложенной загрузки.
Это удаленный сервис...это еще одна часть того же приложения?если да, то нет проблем с общим доступом к классам и отправкой экземпляров туда и обратно (то же самое касается RMI с использованием заглушек).
Кроме того, есть возможность доступа к веб-сервису или чему-то подобному, где два взаимодействующих приложения не имеют общих классов, и это еще больше усложняет ситуацию.Я собираюсь столкнуться с этой проблемой в ближайшем будущем, и мне будет очень интересно узнать ответ.
В любом случае, я голосую за DTO.Я думаю, что они предоставляют лучшее и самое простое решение, где это применимо, и помогают сделать код простым и удобным в сопровождении.
Юваль =8-)
Если ваша удаленная служба существует только для предоставления вашему клиенту данных, то может помочь отключение отложенной загрузки для всех объектов Hibernate.
Однако лично я считаю, что DTO — правильный путь.Выражая свой удаленный интерфейс в терминах DTO, вы уверены, что получите все, что вам нужно, и ничего такого, чего вы не ожидали.