#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»…