2013-12-22 4 views
0

отношения С 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, и я не знаю, как удалить это, когда я удаляю запись о роли или разрешении. когда я изменяю тип каскада на ВСЕ, тогда, когда я удаляю роль или разрешение, отношения удаляются, но это также другая запись, например. если я удалю роль, это разрешение также будет удалено.

Любые идеи, как с этим бороться?

ответ

2

Вам просто нужно удалить разрешение Role.permissions коллекции, чтобы удалить связь между ролью и разрешения:

for (UserRole role: permissionToDelete.getUserRoles()) { 
    role.getPermissions().remove(permissionToDelete); 
} 
em.remove(permissionToDelete); 
+0

Да, это работает, но пока я нашел другое решение, и мне интересно, какой из них лучше. Я устанавливаю внешние ключи в таблице с помощью action delate = cascade, который также выполнял работу без дополнительного кода, так что было бы лучше и почему? Очевидно, с одной стороны, в моем решении меньше кода, но с другой стороны это добавляет дополнительную сложность в DB – Stugal

+0

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

+0

Да, ты прав. У меня есть еще один вопрос, хотя, чтобы обновить запись UserRole (добавить дополнительные разрешения), мне сначала нужно вытащить ее из БД и добавить новые разрешения (ы) в список? Или есть лучший/более быстрый способ? – Stugal

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