@OneToMany без обратной связи и без таблицы соединений? - PullRequest
34 голосов
/ 19 января 2010

Эта проблема аналогична "Hibernate @OneToMany без отдельной таблицы соединений" , в которой мне нужны отношения @OneToMany без таблицы соединений. Однако я также не хотел бы определять обратную зависимость. Удаление инверсии, кажется, приводит к тому, что таблица соединения генерируется автоматически ... Есть ли обходной путь для этого?

Ответы [ 3 ]

51 голосов
/ 19 января 2010

В JPA 2.0+ вы можете использовать @JoinColumn как способ избежать создания объединенной таблицы.

Попробуйте.

@OneToMany
@JoinColumn(name="COLUMN_NAME")

ОБНОВЛЕНИЕ

Информация, предоставленная выше, была взята из EJB 3.0 o'illyilly book (Ищите The @Аннотация JoinColumn ссылается на столбец CUSTOMER_ID в таблице PHONE).Однако простая спецификация JPA 1.0 не поддерживает эту функцию.Он говорит:

Однонаправленные отношения «один ко многим» могут быть реализованы с использованием сопоставлений внешних ключей «один ко многим», однако такая поддержка не требуется в этом выпуске.Приложения, которые хотят использовать стратегию сопоставления внешнего ключа для отношений один-ко-многим , должны сделать эти отношения двунаправленными, чтобы обеспечить переносимость

Так что в 1.0 это поставщик-специфичная реализация (И это имеет смысл, автор работает над JBoss - красная шляпа, разделяющая спящий режим)

Но поддерживается реализацией JPA 2.0

Если соединение предназначено для однонаправленного сопоставления OneToMany с использованием стратегии сопоставления внешнего ключа, внешний ключ находится в таблице целевого объекта .

15 голосов
/ 19 августа 2010

Спецификация JPA 1.0 поддерживает НЕ и поддерживает однонаправленное отображение OneToMany без таблицы соединений .

И использование JoinColumn на OneToMany недопустимо в стандарте JPA 1.0 (только на OneToOne, ManyToOne или ManyToMany).Хотя это в JPA 2.0.

Из спецификации JPA 1.0:

2.1.8.5.1 Однонаправленные отношения OneToMany

Применяются следующие значения отображения по умолчанию:

Объект A сопоставлен с таблицей с именем A.Объект B сопоставлен с таблицей с именем B.Существует таблица соединения с именем A_B (имя владельца сначала).Эта таблица соединения имеет два столбца внешнего ключа.Один столбец внешнего ключа относится к таблице A и имеет тот же тип, что и первичный ключ таблицы A.Имя этого столбца внешнего ключа формируется как объединение следующего: имя объекта A;"_";имя столбца первичного ключа в таблице A.Другой столбец внешнего ключа относится к таблице B и имеет тот же тип, что и первичный ключ таблицы B, и для него существует ограничение уникального ключа.Имя этого столбца внешнего ключа формируется как объединение следующего: имя свойства отношения или поля объекта A;"_";имя столбца первичного ключа в таблице B.

Подводя итог, если вы не хотите присоединяться к таблице (и полностью поддерживать чтение / запись) и все еще хотите быть JPA-совместимым, сделайте двунаправленную ассоциацию (со стороной inverse).

В приведенной ниже ссылке на книгу вики обсуждается хитрость (отображение целевой таблицы в качестве таблицы объединения), чтобы «обойти» проблему, но это работает только длячтение, запись не работает.

Ссылки

0 голосов
/ 20 апреля 2016

Если в базе данных нет таблицы соединений, то связь между двумя таблицами в базе данных будет достигнута с помощью внешнего ключа, ссылающегося на первичный ключ. Если связь осуществляется через PK / FK, в целевом классе должно быть свойство, которое ссылается на источник, чтобы столбец FK заполнялся значением. Это свойство в целевом классе может быть идентификатором или исходным объектом. Если это исходный объект, то вам нужно иметь @ManyToOne обратного в целевом классе.

...