Это проблема, аналогичная "Hibernate @OneToMany без отдельной таблицы соединений", в котором мне нужны отношения @OneToMany без таблицы соединений. Однако я также хотел бы не определять обратную зависимость. Удаление обратного, по-видимому, приводит к автоматической генерации таблицы соединений ... есть ли обходной путь для этого?
@OneToMany без обратной связи и без таблицы соединений?
Ответы (3)
В JPA 2.0+ вы можете использовать @JoinColumn как способ избежать создания объединенной таблицы.
Попробуй.
@OneToMany
@JoinColumn(name="COLUMN_NAME")
ОБНОВЛЕНИЕ
Предоставленная выше информация была извлечена из книги EJB 3.0 o'reilly (ищите аннотацию @JoinColumn, ссылающуюся на столбец CUSTOMER_ID в таблице PHONE). Однако обычная спецификация JPA 1.0 не поддерживает эту функцию. То, что он говорит,
Однонаправленные отношения «один ко многим» могут быть реализованы с использованием сопоставлений внешних ключей «один ко многим», однако в этом выпуске такая поддержка не требуется. Приложения, которые хотят использовать стратегию сопоставления внешних ключей для отношений "один ко многим", должны сделать эти отношения двунаправленными, чтобы обеспечить переносимость
Таким образом, в версии 1.0 это реализация, зависящая от поставщика (и это имеет смысл, автор работает в JBoss — подразделении Red Hat, стоящем за спящим режимом)
Но поддерживается реализацией JPA 2.0
Если соединение предназначено для однонаправленного сопоставления OneToMany с использованием стратегии сопоставления внешнего ключа, внешний ключ находится в таблице целевого объекта.
Спецификация 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
).
В приведенной ниже ссылке на вики-книгу обсуждается трюк (сопоставление целевой таблицы как таблицы соединения), чтобы «обойти» проблему, но это работает только для чтения, записи не будут работать.
использованная литература
- JPA 1.0 specification
- 2.1.8.2 Bidirectional ManyToOne / OneToMany Relationships
- 2.1.8.5.1 Однонаправленные отношения OneToMany
- 9.1.6 Аннотация JoinColumn (обсуждает, в каком контексте можно использовать эту аннотацию)
- JPA Wiki Book
Если в базе данных нет таблицы соединения, то связь между двумя таблицами в базе данных будет достигнута с помощью внешнего ключа, ссылающегося на первичный ключ. Если связь осуществляется через PK/FK, в целевом классе должно быть свойство, которое ссылается на источник, чтобы столбец FK заполнялся значением. Это свойство в целевом классе может быть идентификатором или исходным объектом. Если это исходный объект, вам нужно иметь обратный @ManyToOne в целевом классе.