отношения С 2h Я пытаюсь придумать решение для следующей задачи, и я просто не могу найти правильный способ сделать это:ManyToMany отношения, удаление записей из таблицы
У меня есть три таблицы в MySQL DB:
Роль [ROLE_ID] [имя_роли]
Разрешение [permission_id] [PERMISSION_NAME]
PermissionToRole [permission_id] [ROLE_ID]
У меня есть класс роли в качестве владельца отношений:
@ManyToMany(cascade = {CascadeType.MERGE, CascadeType.PERSIST, CascadeType.REFRESH})
@JoinTable(name="permissiontorole",
joinColumns={@JoinColumn(name="role_id")},
inverseJoinColumns={@JoinColumn(name="permission_id")})
отображения класса Разрешения определяется как:
@ManyToMany(mappedBy="permissions")
private Set<UserRole> userRoles = new HashSet<UserRole>();
Теперь, когда я удалю либо разрешения, либо роль этих соответствующие записей удалены из их таблиц (это ожидается и желательно), но отношения все еще остаются в таблице PermissionToRole, и я не знаю, как удалить это, когда я удаляю запись о роли или разрешении. когда я изменяю тип каскада на ВСЕ, тогда, когда я удаляю роль или разрешение, отношения удаляются, но это также другая запись, например. если я удалю роль, это разрешение также будет удалено.
Любые идеи, как с этим бороться?
Да, это работает, но пока я нашел другое решение, и мне интересно, какой из них лучше. Я устанавливаю внешние ключи в таблице с помощью action delate = cascade, который также выполнял работу без дополнительного кода, так что было бы лучше и почему? Очевидно, с одной стороны, в моем решении меньше кода, но с другой стороны это добавляет дополнительную сложность в DB – Stugal
Обычно вы хотите, чтобы исключение было выбрано, когда вы удаляете разрешение, на которое по-прежнему ссылается роль, потому что это означает, что вы, вероятно, забыли что нибудь. Слепое удаление разрешения и его ассоциаций с ролями благодаря каскаду позволяет удалить разрешение, даже не проверяя, сохраняет ли его роль, что может быть проблемой. –
Да, ты прав. У меня есть еще один вопрос, хотя, чтобы обновить запись UserRole (добавить дополнительные разрешения), мне сначала нужно вытащить ее из БД и добавить новые разрешения (ы) в список? Или есть лучший/более быстрый способ? – Stugal