Это аналогичная проблема для "Hibernate @OneToMany без отдельной таблицы соединений" , поскольку мне нужно отношение @OneToMany без таблицы соединений. Тем не менее, я также хотел бы не определять обратную связь. Удаление обратного, похоже, приводит к тому, что таблица соединений автоматически генерируется... есть ли это для этого?
@OneToMany без обратной связи и без таблицы соединений?
Ответ 1
В JPA 2.0+ вы можете использовать @JoinColumn как способ избежать создания объединенной таблицы.
Попробуйте.
@OneToMany
@JoinColumn(name="COLUMN_NAME")
UPDATE
Информация, представленная выше, была извлечена из книги EJB 3.0 o'reilly (Ищите аннотацию @JoinColumn ссылается на столбец CUSTOMER_ID в таблице PHONE). Однако простая спецификация JPA 1.0 не поддерживает эту функцию. Что он говорит,
Однонаправленные отношения "один ко многим" могут быть реализованы с использованием сопоставлений внешнего ключа "один ко многим" , однако такая поддержка в этой версии не требуется. Приложения, которые хотят использовать стратегию сопоставления внешнего ключа для отношений "один ко многим" , должны сделать эти отношения двунаправленными, чтобы обеспечить переносимость
Итак, в 1.0 это специфическая для вендора реализация (И это имеет смысл, автор работает в JBoss - красная шляпа divison за спящим)
Но поддерживается поддержкой JPA 2.0
Если соединение является однонаправленным отображением OneToMany с использованием стратегии сопоставления внешнего ключа, внешний ключ находится в таблице целевого объекта.
Ответ 2
Спецификация 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 и имеет тот же тип, что и первичный ключ tableB
и есть уникальный ключ ограничение на него. Название этого колонка с внешним ключом формируется как конкатенация следующего: имя свойства отношения или поле сущности A; "_"; имя столбец первичного ключа в таблицеB
.
Подводя итог, если вы не хотите, чтобы таблица Join (и полная поддержка чтения/записи) и все еще должна быть совместимой с JPA, сделайте ассоциацию двунаправленной (со стороной inverse
).
В приведенной ниже ссылке в вики-книге описывается трюк (сопоставление целевой таблицы как таблицы соединений), чтобы "обойти" проблему, но это работает только для чтения, записи не будут работать.
Ссылки
- Спецификация JPA 1.0
- 2.1.8.2 Двунаправленные отношения ManyToOne/OneToMany
- 2.1.8.5.1 Однонаправленные отношения OneToMany
- 9.1.6 JoinColumn Annotation (обсуждает, в каком контексте эта аннотация может быть использована)
- Книга Wiki Wiki
Ответ 3
Если в базе данных нет таблицы соединений, связь между двумя таблицами в базе данных будет достигнута с помощью внешнего ключа, относящегося к первичному ключу. Если связь осуществляется через PK/FK, в целевом классе должно быть свойство, которое ссылается на источник, так что столбец FK заполняется значением. Это свойство в целевом классе может быть идентификатором или исходным объектом. Если это исходный объект, вам нужно иметь обратный @ManyToOne в целевом классе.