Подтвердить что ты не робот

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

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

4b9b3361

Ответ 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 и имеет тот же тип, что и первичный ключ table B и есть уникальный ключ ограничение на него. Название этого колонка с внешним ключом формируется как конкатенация следующего: имя свойства отношения или поле сущности A; "_"; имя столбец первичного ключа в таблице B.

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

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

Ссылки

Ответ 3

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