Отображение «один к одному» в режиме гибернации с использованием только внешнего идентификатора

#java #sql #hibernate

#java #sql #гибернация

Вопрос:

Учитывая, что мы имеем

таблицы Person (идентификатор, address_id) и Address (идентификатор, город)

и POJO

класс Person {

  int id;
 int addressId;  
  

}

адрес класса{
int id;
String town;

}

Возможно ли сопоставить адрес с человеком? (Гибернация)

* Запрашивая пользователя, вы получите только его идентификатор и идентификатор адреса

Возможно ли также искать человека по его / ее городу?

ОБНОВЛЕНИЕ: Я хотел бы добавить: использование класса Person ограничено только int addressId; Одной из причин может быть то, что мы хотим, чтобы класс Person был атомарным (все данные независимы) и использовал его для веб-служб или тому подобного

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

Ответ №1:

Замените private int addressId; поле Person на поле 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'
)
  

Комментарии:

1. @thirdy: я расширил свой ответ

Ответ №2:

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

 class Person {
    Integer id;
    Address address;
}
  

Затем вы могли бы запросить «ВЫБРАТЬ p.id , p.address.id ОТ Person p» и «ВЫБЕРИТЕ p ОТ Person p, ГДЕ p.адрес.town = :town»…