Hibernate Карта объекта без отношения - PullRequest
0 голосов
/ 01 апреля 2011

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

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

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

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

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

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

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

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

1 Ответ

0 голосов
/ 12 апреля 2011

Здесь есть два вопроса:

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

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

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

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

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

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

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

...