проблема удаления "многие ко многим" с игровой структурой - PullRequest
2 голосов
/ 23 марта 2011

PlayFramework (JPA, Hibernate). Два объекта software <- m: n -> tag, software является владельцем отношения. И я не использую cascading. Я хочу удалить tag, в котором есть несколько программ.

Учитывая, что software является стороной владельца, я пишу в своем классе Tag:

class Tag {
  @Override
  public Tag delete() {
    for (Software software : this.softwares) {
        software.tags.remove(this);
        software.save(); // if we delete this, we will have an error - a foreign key constraint fails
    }
    return super.delete();
  }
}

Теперь это работает хорошо, после того как я добавил строку software.save(). Вопрос в том, почему я должен это делать?

У меня есть другой проект - без Play Framework - который использует JPA-> Hibernate, и там мне не нужно это делать. Так в чем же разница?

В по этой ссылке они также не используют save ().

1 Ответ

1 голос
/ 23 марта 2011

Код из примера, на который вы ссылаетесь, и ваш код не совпадают.

В коде, который вы связали, они удаляют несколько элементов, но если вы читаете в комментарии ниже, они говорят:

// then merge() and flush()

, который сохранит изменения в базе данных. Они также делают удаление из класса, которому принадлежит отношение.

В вашем сценарии вы удаляете теги, а владельцем является другой конец отношения. Таким образом, вы используете (правильно) software.tags.remove для очистки отношения.

Теперь, если вы не сохраните изменения, Entity Manager еще не подтвердит изменения, и когда он попытается удалить тег, этот Entity Manager обнаружит активное отношение M: N и потерпит неудачу.

Причина заключается в явном явном сохранении Play, в котором вы должны сообщить системе об изменениях, которые нужно сохранить, что отличается от «стандартного» способа работы Hibernate (JPA), когда объекты автоматически совершено (вместе с изменениями), когда транзакция заканчивается.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...