В этом коде, как создать класс Java для составного ключа (как составной ключ в спящем режиме):
create table Time (
levelStation int(15) not null,
src varchar(100) not null,
dst varchar(100) not null,
distance int(15) not null,
price int(15) not null,
confPathID int(15) not null,
constraint ConfPath_fk foreign key(confPathID) references ConfPath(confPathID),
primary key (levelStation, confPathID)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
Ответы:
Для отображения составного ключа, вы можете использовать
EmbeddedId
или вIdClass
аннотации. Я знаю, что этот вопрос касается не только JPA, но также применяются правила, определенные в спецификации. Итак, вот они:С
IdClass
Класс для составного первичного ключа может выглядеть (может быть статическим внутренним классом):
И сущность:
IdClass
Аннотацию отображает несколько полей в таблице PK.С участием
EmbeddedId
Класс для составного первичного ключа может выглядеть (может быть статическим внутренним классом):
И сущность:
@EmbeddedId
Аннотацию отображает класс PK для настольных ПК.Отличия:
@EmbeddedId
каким-то образом более четко сообщается, что ключ является составным ключом, и IMO имеет смысл, когда объединенный pk либо является значимым объектом, либо используется повторно в вашем коде .@IdClass
Полезно указать, что некоторая комбинация полей является уникальной, но они не имеют специального значения .Они также влияют на то, как вы пишете запросы (делая их более или менее подробными):
с участием
IdClass
с участием
EmbeddedId
Ссылки
источник
id
всегдаnull
генерируется и не генерируется: /@IdClass
: «Он был унаследован от темных веков EJB 2 для обратной совместимости, и мы рекомендуем вам не использовать его (для простоты ради»).Вам необходимо использовать
@EmbeddedId
:источник
Как я объяснил в этой статье , при условии, что у вас есть следующие таблицы базы данных:
Во-первых, вам нужно создать
@Embeddable
удержание составного идентификатора:Имея это в виду, мы можем отобразить
Employee
объект, который использует составной идентификатор, пометив его@EmbeddedId
:Phone
Лицу , которое имеет@ManyToOne
связь сEmployee
, нужно ссылаться на составной идентификатор из родительского класса с помощью двух@JoinColumn
отображений:Для более подробной информации, проверьте эту статью .
источник
Класс первичного ключа должен определять методы equals и hashCode
Более технически: Вы должны следовать Принципу замещения Лисковса и игнорировать симметрию.
http://www.laliluna.de/jpa-hibernate-guide/ch06s06.html
источник
Похоже, вы делаете это с нуля. Попробуйте использовать доступные инструменты обратного проектирования, такие как Netbeans Entities из базы данных, чтобы хотя бы автоматизировать основы (например, встроенные идентификаторы). Это может стать огромной головной болью, если у вас много столов. Я предлагаю не изобретать велосипед и использовать как можно больше инструментов, чтобы свести к минимуму кодирование до самой важной части того, что вы собираетесь делать.
источник
Давайте возьмем простой пример. Допустим, две таблицы названы
test
иcustomer
там описаны как:Есть еще одна таблица, которая отслеживает
test
s иcustomer
:Мы можем видеть, что в таблице
tests_purchased
первичный ключ является составным ключом, поэтому мы будем использовать<composite-id ...>...</composite-id>
тег вhbm.xml
файле отображения. ТакPurchasedTest.hbm.xml
будет выглядеть так:Но это не заканчивается здесь. В Hibernate мы используем session.load (
entityClass
,id_type_object
), чтобы найти и загрузить объект, используя первичный ключ. В случае составных ключей объект ID должен быть отдельным классом идентификатора (в вышеупомянутом случаеPurchasedTestId
классом), который просто объявляет атрибуты первичного ключа, как показано ниже :Важным моментом является то, что мы также реализуем две функции,
hashCode()
и,equals()
поскольку Hibernate полагается на них.источник
Другим вариантом является сопоставление в виде карты составных элементов в таблице ConfPath.
Это сопоставление выиграет от индекса на (ConfPathID, levelStation), хотя.
Отображение:
источник
Класс составного ключа
Класс сущности
источник