У @oneToMany с @JoinTable есть уникальное ограничение в jpa?
У меня есть две таблицы, которые имеют сущность пользователя
@OneToMany
@JoinTable(name="user_roles")
private List<Role> roles;
Роль субъекта имеет пользователя
@ManyToOne
private User user;
Описание таблицы user_role
Name Null
USER_RECORD_ID NOT NULL NUMBER(19)
ROLE_RECORD_ID NOT NULL NUMBER(19)
ПРИМЕЧАНИЕ. Пользователь может иметь несколько ролей, и я уже создал роли с помощью сценария, с Id:10001,10002,10003 и т. Д.
В таблице ролей user_role я вставляю одного пользователя 800001 со всеми ролями, чтобы таблица выглядела как
USER_RECORD_ID ROLE_RECORD_ID
800001 10001
800001 10002
800001 10003
800002 10001 ///This record will through me unique constraint error
Так что, если я пытаюсь дать роль новому пользователю, где роль предопределена, то через меня эта ошибка
INSERT INTO USER_ROLE(USER_RECORD_ID,ROLE_RECORD_ID) VALUES(800002,10001)
Отчет об ошибке - Ошибка SQL: ORA-00001: уникальное ограничение (SYSTEM.UK_LPLHY51JOJA1LP4465QK2E0AF) нарушено 00001. 00000 - "уникальное ограничение (%s.% S) нарушено" * Причина: оператор UPDATE или INSERT попытался вставить дублирующийся ключ. Для Trusted Oracle, настроенного в режиме MAC СУБД, вы можете увидеть это сообщение, если дублирующая запись существует на другом уровне. * Действие: либо удалите уникальное ограничение, либо не вставляйте ключ.
2 ответа
Я думаю, что ошибка вызвана использованием @ManyToOne
/@OneToMany
в то время как ваши отношения @ManyToMany
, Это так, потому что в примере вы даете USER_RECORD_ID
со значением 800001
имеет несколько ROLE_RECORD_ID
и ROLE_RECORD_ID
со значением 10001
имеет несколько USER_RECORD_ID
,
Поэтому попробуйте использовать @ManyToMany
вместо этого это должно решить вашу проблему. Вот справка на тот случай, если вам это нужно: https://en.wikibooks.org/wiki/Java_Persistence/ManyToMany
Вы неправильно настроили свои сопоставления, так как кажется, что вы намеревались иметь двунаправленное отношение, которое использует таблицу отношений, но вместо этого настроили два независимых отношения. Во-первых, User.roles использует таблицу отношений, но другая
@ManyToOne
private User user;
говорит JPA установить отношение "Роль-пользователь", которое использует внешний ключ в таблице "Роль". Это, похоже, не является источником вашей проблемы, но вызовет у вас другие проблемы и не будет соответствовать тому, о чем вы просите. Ваша роль может ссылаться только на одного пользователя, но вы просите назначить роли нескольким пользователям., Пытаться:
@ManyTooMany
@JoinTable(name="user_roles")
private List<Role> roles;
.. а в роли Роль:
@ManyTooMany(mappedby"roles")
private List<User> users;
Также убедитесь, что вы удалили схему базы данных и позволили JPA воссоздать базу данных, используя эти новые сопоставления.