私のクレイジーな宇宙では、部屋には多くの椅子があり、椅子は多くの部屋に「属する」ことができます。グレイルではこんな感じ。椅子は、自分がどの部屋に属しているかを認識してはなりません。
class Room {
String name
static hasMany = [chairs: Chair]
static constraints = {
}
}
class Chair {
String name
static constraints = {
}
}
椅子を削除し、その椅子を持つすべての部屋ドメイン オブジェクトで椅子の参照を自動的に削除したいと考えています。私は成功しましたが、気に入らない修正があります。ChairController で、次のことを行いました
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)
}
これを自動的に行うために設定する必要がある休止状態の設定はありますか? 現実世界のシナリオでは非常に一般的なもののようです。Car ドメインオブジェクトが多くの椅子を持つことができるとおそらく決定するとき(よりクレイジーな例)、同じコードを実装したくありません。
grails イベント プッシュ プラグインを使用しようとしました。gorm で beforeDelete イベントをリッスンするアクションを持つ ChairService がありました。
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)
}
}
}
}
この関数は、椅子の削除が試行されるたびに呼び出されますが、実際の椅子の削除を行うために ChairController に戻ると、削除アクションは引き続き Room への参照がまだ存在すると見なし、
Caused by JdbcSQLException: Referential integrity constraint violation:"FK4ACA6A6151428364: PUBLIC.ROOM_CHAIR FOREIGN KEY(CHAIR_ID) REFERENCES PUBLIC.CHAIR(ID)"; SQL statement:
id=? の椅子から削除 バージョン=? [23503-164]
私はこのロジックを椅子とは別にしたいと思っています。