Trong vũ trụ điên rồ của tôi, Phòng có thể có nhiều ghế và ghế có thể 'thuộc' cho nhiều phòng. Trong grails nó trông như thế này. Ghế không nên biết phòng thuộc về họ.Bắt 'vi phạm ràng buộc toàn vẹn tham chiếu' khi xóa đối tượng miền
class Room {
String name
static hasMany = [chairs: Chair]
static constraints = {
}
}
class Chair {
String name
static constraints = {
}
}
Tôi muốn xóa ghế và tự động xóa mọi tham chiếu ghế trong tất cả các đối tượng miền phòng có ghế đó. Tôi đã thành công, nhưng với một sửa chữa mà tôi không thích. Trong ChairController tôi đã làm như sau
def deleleChair(){
def chairToDelete = Chair.get(params.id)
Room.findAll().each {room->
if(room.chairs.contains(chairToDelete)){
room.removeFromChairs(chairToDelete)
room.save(failOnError:true)
}
}
chairToDelete.delete(params.chairId)
}
Có cấu hình hibernate mà tôi cần thiết để tự động thực hiện điều này không? Nó có vẻ như một cái gì đó rất phổ biến trong các tình huống thế giới thực. Tôi sẽ không muốn thực hiện cùng một đoạn mã, khi tôi có thể quyết định, (ví dụ điên rồ) rằng một đối tượng miền xe có thể có nhiều ghế.
Tôi đã cố sử dụng plugin đẩy sự kiện grails. Tôi đã có một ChairService với một hành động lắng nghe các sự kiện beforeDelete trong gorm.
class ChairService {
@grails.events.Listener(topic = 'beforeDelete', namespace = "gorm")
def handleDeletedChair(Chair chair){
Room.findAll().each {room->
if(room.chairs.contains(chairToDelete)){
room.removeFromChairs(chairToDelete)
room.save(failOnError:true, flush:true)
}
}
}
}
Chức năng này được gọi là bất cứ khi nào một chiếc ghế xóa được cố gắng, nhưng khi nó trở về ChairController để làm việc xóa ghế thực tế, hành động xóa vẫn nghĩ rằng các tài liệu tham khảo để phòng vẫn còn đó và ném một
Caused by JdbcSQLException: Referential integrity constraint violation:"FK4ACA6A6151428364: PUBLIC.ROOM_CHAIR FOREIGN KEY(CHAIR_ID) REFERENCES PUBLIC.CHAIR(ID)"; SQL statement:
xóa khỏi ghế có id =? và phiên bản =? [23503-164]
Tôi muốn logic này tách biệt khỏi ghế, ghế không bao giờ nên không có phòng.
Nếu bạn không quan tâm rằng Chủ tịch có thể xem Phòng, điều này dễ dàng hơn rất nhiều. – Gregg