2016-06-04 2 views
0

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

Таблицы базы данных:

student 
--------------- 
    id (PK) | docket (UNIQUE) 

    inscription 
--------------- 
course_id | docket 

inscription's PK is (course_id, docket) 

    course 
--------------- 
    id (PK) 

Вышеуказанные проблемы поднимают со следующей конфигурацией:

На Студенческой Entity:

@ManyToMany 
@JoinTable(
      name="inscription", 
      [email protected](referencedColumnName = "docket", name="docket"), 
      [email protected](name="course_id", referencedColumnName = "id") 
) 
private List<Course> studentCourses; 

На курс Entity:

@ManyToMany(mappedBy = "studentCourses") 
private List<Student> students; 

Чтовызывает проблема заключается в том, что, когда проект развертывания, Hibernate выполняет оператор:

alter table public.inscription add constraint FKp625s5r1hmlggpgeq4x2nju91 foreign key (docket) references public.student 

который (конечно же) неверно, так как она не уточняя, что досье является уникальным полем.

Что следует делать это:

alter table public.inscription add constraint FKp625s5r1hmlggpgeq4x2nju91 foreign key (docket) references public.student(docket) 

, но я не знаю, как я могу сказать ему, чтобы сделать это.

Любая помощь? Спасибо заранее.

+0

_referencedColumnName_ в целом относится к случаям, когда у вас есть несколько полей PK в конце отношения, поэтому вы можете выровнять различные столбцы PK с эквивалентными столбцами в таблице соединений. В спецификации JPA нет ничего, что я знаю об этом, что позволяет использовать не-PK-поля для соединения; уверенный, что провайдер JPA может это разрешить, но на ваш взгляд, похоже, нет. –

+0

Благодарим вас за комментарий! Однако, насколько я знаю, каждая таблица базы данных может иметь только PK, а другие идентификаторы таблицы должны быть определены как UNIQUE.Как PK, так и UNIQUE используются как индексы по реализации базы данных, но разница в том, как данные организованы в базе данных (прозрачно для пользователей db). Вот почему я думал, что с PK документа JPA ссылается на любой из идентификаторов таблицы (ограничения PK + UNIQUE). Возможно, это относится к столбцу составного ПК, и я неправильно понял документацию. – R4N63RW4R

ответ

1

Нашел ответ в официальной документации.

С JPA 2.0 документации: http://download.oracle.com/otndocs/jcp/persistence-2.0-fr-oth-JSpec/:

11.1.21 JoinColumn Аннотация

аннотациями JoinColumn используются для указания столбца для присоединения Субъекта ассоциации или элемента сбора.

...

Элемент имя аннотаций определяет имя столбца ключа иностранного. Оставшиеся аннотации элементов (кроме ссылочных имен столбцов) относятся к этому столбцу и имеют ту же семантику, что и для аннотации столбцов.

Если элемент referencedColumnName отсутствует, предполагается, что внешний ключ относится к основному ключу ссылочной таблицы.

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

Так, возможно, происходило то, что Hibernate не обладает этой функцией, поскольку это не обязательно.

Что я сделал, чтобы исправить это, нужно было изменить таблицу надписей, заменив каждое поле соответствующим первичным ключом.

1

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

Ваше предположение находится в противоречии с JPA 2.0 specification условии, что вы используете Hibernate как реализация JPA, потому что в следующем извлечении указано, что вы должны присоединиться к первичным ключам.

2.10.4 Двунаправленного ManyToMany Отношение

Если предположить, что::

  • Субъект А ссылается на коллекции Entity B.

  • Он ничего не знаю о уникальных полях не говорит
  • Предприятие B ссылается на совокупность объекта A.

  • Объект A является владельцем отношений.

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

  • Субъект А отображается в таблице с именем А.
  • Компания Б отображается в виде таблицы с именем Б.

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

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

(я добавил формат, текст оригинала цитата из спецификации.)

в списке дел не является первичным ключом в вашем случае, и поэтому вы не можете присоединиться на нем.

+0

Спасибо за ответ! Не могли бы вы добавить ссылку, в которой вы указали ответ? Заранее спасибо! – R4N63RW4R

+0

Я хотел дать ссылку на источник, но думал, что ее легко найти. [Herr] (http://download.oracle.com/otndocs/jcp/persistence-2.0-fr-oth-JSpec/) это любой способ. – ujulu

+0

Спасибо! Как вы говорите, в документации говорится: «Следующие значения по умолчанию применяются: .._». Однако JPA предоставляет различные инструменты, чтобы избежать использования этих конфигураций по умолчанию, и это то, что я ищу. Я уверен, что они должны существовать, поскольку то, что я хочу сделать, возможно напрямую написать команду в базе данных. Если вы можете найти эти инструменты (атрибуты аннотаций), пожалуйста, дайте мне знать. Еще раз спасибо, что потратили свое время на это! Я очень ценю это. – R4N63RW4R

Смежные вопросы