Grails: удаление каскада и внешние ключи - PullRequest
0 голосов
/ 12 августа 2010
public class Room {
  static belongsTo = [hotel:Hotel]
  Source source
  long sourceid
  RoomType type
  float price
  float oldPrice
  Currency currency
  boolean isShown = false
  boolean approved = false
  static hasMany = [roomTexts:RoomText]

  def beforeDelete () {
    Photos.withNewSession {
      Photos.findAllByRoom(this).each {photosInstance->
        photosInstance.delete()
      }
    }

    RoomFeatures.withNewSession {
      RoomFeatures.findAllByRoom(this).each {roomF->
        roomF.delete()
      }
    }
  }

}



Тогда:

def room = Room.get(1) 
room.delete()

Будет выбрасывать com.mysql.jdbc.exceptions.jdbc4.MySQLIntegrityConstraintViolationException.

Cannot delete or update a parent row: a foreign key constraint fails (`prod_test`.`photos`, CONSTRAINT `FKC50C8881EC5F6358` FOREIGN KEY (`room_id`) REFERENCES `room` (`id`))

Это происходит потому, что сеанс удаления фотографий еще не записан в БД, и Hibernate пытается удалить объект Room, я думаю ...

Вот код удаления номера:

Room.withTransaction{status->
   roomInstance.delete(flush: true)
}

Есть ли обходной путь или "правильный путь" для решения этой проблемы?
Конечно, я мог бы вручную удалить все фотографии перед удалением комнаты, но использование beforeDelete помогает содержать код в чистоте и избежать дублирования кода.

Ответы [ 2 ]

2 голосов
/ 12 августа 2010

Почему вы не можете иметь фотографии в списке hasMany вместе с RoomText и сделать фотографии принадлежащими Room?

0 голосов
/ 12 августа 2010

Если фотографии принадлежат Комнате, вам не нужно удалять их заранее. Просто удалите Комнату, и Фотографии идут с этим правильно? Хотя я не вижу взаимосвязи между Photo и Room, но, возможно, было бы яснее, если бы вы опубликовали свой класс Photo.

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