Grails:级联删除和外键

时间:2010-08-12 14:57:23

标签: hibernate grails

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 个答案:

答案 0 :(得分:2)

为什么你不能将hasMany列表中的照片与RoomText一起拍照,并使照片属于Room?

答案 1 :(得分:0)

如果照片归房间所有,则不必事先删除它们。只需删除房间,照片就可以了吗?虽然我没有看到Photo和Room之间的关系,但是如果你发布了你的Photo类,也许会更清楚。