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 помогает содержать код в чистоте и избежать дублирования кода.