Код из примера, на который вы ссылаетесь, и ваш код не совпадают.
В коде, который вы связали, они удаляют несколько элементов, но если вы читаете в комментарии ниже, они говорят:
// then merge() and flush()
, который сохранит изменения в базе данных. Они также делают удаление из класса, которому принадлежит отношение.
В вашем сценарии вы удаляете теги, а владельцем является другой конец отношения. Таким образом, вы используете (правильно) software.tags.remove для очистки отношения.
Теперь, если вы не сохраните изменения, Entity Manager еще не подтвердит изменения, и когда он попытается удалить тег, этот Entity Manager обнаружит активное отношение M: N и потерпит неудачу.
Причина заключается в явном явном сохранении Play, в котором вы должны сообщить системе об изменениях, которые нужно сохранить, что отличается от «стандартного» способа работы Hibernate (JPA), когда объекты автоматически совершено (вместе с изменениями), когда транзакция заканчивается.