Каскад работает на уровне сущностей. Поскольку Person_Role
не отображается как сущность, каскад не может помочь вам AFAIK.
Вы можете использовать уровень базы данных "при каскадном удалении" для внешнего ключа от Person_Role
до Role
.
Или вы можете - как указывает sfussenegger - программно удалить связь. Обратите внимание, что, поскольку вы сопоставили связь для обеих сущностей, каждая строка в Person_Role
будет дважды отображаться в вашей объектной модели. В таких случаях рекомендуется удалить соответствующие записи из обеих коллекций, чтобы не повредить вашу объектную модель. Однако Hibernate при сохранении изменений будет смотреть только на конец ассоциации, который не сопоставлен с inverse="true"
. То есть, чтобы удалить из ассоциации с вашим текущим отображением, вы должны удалить из Person.roles
, а не Role.assignments
:
for (Person p : role.assignments) {
person.roles.remove(role)
}
Или вы можете заменить отображение «многие ко многим» на объект ассоциации, в этом случае вы можете просто использовать каскад. Это позволит вам более легко добавлять больше информации в назначения. Например, если вам нужно было выразить «Джо работает 30% на контроле качества и 70% инженером по требованиям», вы можете просто добавить это поле в ассоциацию.