Спящий режим Сопоставьте объект без отношения

У меня есть ситуация, когда у меня есть такие отношения:

У человека есть один или несколько адресов. У клиента есть один или несколько адресов.

Персона, клиенты и адреса — это отдельные таблицы.

Раньше я делал это с отношениями @OneToMany. Это вызывает у меня проблемы, так как наш гибкий клиент отправляет мне объекты, которые созданы в клиенте и должны быть созданы в БД.

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

Это проблема, вызванная BlazeDS и Dozer, которые создают новые объекты при их отправке на сервер.

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

Кто-нибудь знает возможно ли это?


person Arjen vd Have    schedule 01.04.2011    source источник


Ответы (1)


Здесь есть две проблемы:

  • Ленивая загрузка данных и
  • Разрешение объекта / Один канонический экземпляр объекта на клиенте

Существуют фреймворки, которые могут помочь, но у проблемы пока нет универсального решения.

dpHibernate поможет отложенной загрузке данных, т.е.:

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

К сожалению, разрешение сущностей пока не поддерживается для нескольких вызовов в dpHibernate. т. е. - если вызов возвращает один и тот же объект в двух местах внутри вызова сервера (например, один и тот же объект Address в обоих объектах Customer id:1 и Customer id:2, тогда вы получите один экземпляр Address в обоих объектах клиента.

Однако, если данные загружаются отдельными вызовами, вы получите два экземпляра Address. Это ошибка, реализация которой запланирована в v3.

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

person Marty Pitt    schedule 12.04.2011
comment
Спасибо, я посмотрю на dpHibernate lib. Мы попробовали Gilead, так как это выглядело многообещающе, но мы столкнулись с ошибкой, и, к сожалению, никто не отвечает на форуме. - person Arjen vd Have; 18.04.2011