Как инициализировать объекты Hibernate, полученные с помощью удаленного вызова метода?

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

  •  02-07-2019
  •  | 
  •  

Вопрос

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

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

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

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

  2. Нравится 1.но создайте DTO

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

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

  5. Разработать собственный «Шаблон предварительной загрузки», т.е.способ для клиента явно указать, какие свойства предварительно загружать.

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

Решение

Раньше я использовал 1, и он работал хорошо.

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

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

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

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

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

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

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

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

Юваль =8-)

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

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

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