У @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 воссоздать базу данных, используя эти новые сопоставления.

Другие вопросы по тегам