Отображение Hibernate один на один с использованием только внешнего идентификатора - PullRequest
0 голосов
/ 11 апреля 2011

Учитывая, что у нас есть

таблицы Персона (id, address_id) и Адрес (id, город)

и POJO

класс Person {

 int id;
 int addressId;  

}

Адрес класса {
int id;
Струнный город;

}

Можно ли сопоставить адрес человеку? (Hibernate)

* Опрос лица получает только его идентификатор и идентификатор адреса

Можно ли искать человека по его городу?

UPDATE: Я хотел бы добавить: класс Person ограничен использованием только int addressId; Одной из причин этого может быть то, что мы хотим, чтобы класс Person был атомарным (все данные независимы), и используем его для веб-служб и т. П.

заранее спасибо

Ответы [ 2 ]

4 голосов
/ 11 апреля 2011

Замените поле private int addressId; в Персоне на поле private Address address; и добавьте аннотацию @OneToOne к полю.

@Entity
class Person {
  @Id
  int id;

  @OneToOne
  Address address;
}

@Entity
class Address{
   @Id
   int id;

   String town;
}

Если Address не является собственной таблицей, тогда обратите внимание на аннотацию @Embeddable. (Пример в Глава 2.2.2.2. Тип доступа справочной информации по Hibernate)


Обновление:

Я хотел бы добавить: класс Person ограничен использованием только int addressId;

вам нужен более сложный HQL-запрос: см. Справочная документация по Hibernate

SELECT p FROM Person as p
WHERE p.addressId in (
    SELECT a.id FROM Address AS a WHERE a.town = 'Dresden'
)
0 голосов
/ 11 апреля 2011

Прежде всего ... здесь не очень хороший выбор, так как идентификаторы могут быть нулевыми (если они не сохраняются и получают свое значение как @GeneratedValue, а хранение addressId обременительно ... Как насчет

class Person {
    Integer id;
    Address address;
}

Затем вы можете запросить «ВЫБЕРИТЕ p.id, p.address.id ОТ персоны p» и «ВЫБРАТЬ p ИЗ ПОЛУЧИТЕЛЯ p, ГДЕ p.address.town =: town" ...

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...