@OneToMany без обратной связи и без таблицы соединений?

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


person jsight    schedule 19.01.2010    source источник


Ответы (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 с использованием стратегии сопоставления внешнего ключа, внешний ключ находится в таблице целевого объекта.

person Arthur Ronald    schedule 19.01.2010
comment
На самом деле это не разрешено спецификацией JPA 1.0, это специфично для Hibernate. - person Pascal Thivent; 19.08.2010
comment
@Pascal Thivent Я согласен со спецификацией JPA. Имеет смысл создать объединенную таблицу. Это позволяет избежать проблем, подобных показанным здесь (да, любимая звезда была отмечена мной): stackoverflow.com/questions/1275481/ Но предоставленная информация была собрана в EJB 3.0 или действительно Найдите аннотацию @JoinColumn ссылается на столбец CUSTOMER_ID в таблице PHONE Поскольку автор работает на JBoss, имеет смысл видеть такие вещи - person Arthur Ronald; 19.08.2010
comment
Хорошая новость заключается в том, что все это исправлено в JPA 2.0. Но вы могли бы просто уточнить в своем ответе, что это работает с Hibernate (но не является стандартным JPA 1.0). Тогда я мог бы проголосовать :) - person Pascal Thivent; 19.08.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).

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

использованная литература

  • 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
person Pascal Thivent    schedule 18.08.2010
comment
@Артур Привет, Артур! У вас тоже есть мой голос, ваш ответ просто прекрасен в контексте ОП. Мой ответ предназначен только для читателей, интересующихся тем, что JPA 1.0 может сказать по этому поводу. - person Pascal Thivent; 22.09.2010

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

person dinesh ranawat    schedule 20.04.2016