私の狂った世界では、部屋は多くの椅子を持つことができ、椅子は多くの部屋に「所属」することができます。 grailsでは、このように見えます。椅子は彼らがどの部屋に属しているかを知るべきではありません。ドメインオブジェクトを削除するときに「参照整合性制約違反」を取得する
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)
}
私は、これは自動的にないように設定する必要が休止状態の設定はありますか?実際のシナリオでは非常に一般的なもののようです。カードメインオブジェクトが多くの椅子を持つことができると私はおそらく決める(狂気の例)、私は同じコードを実装したくないです。
私は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に戻ったときに、削除アクションは依然としてルームへの参照がまだそこにあると投げることを考えてさ
Caused by JdbcSQLException: Referential integrity constraint violation:"FK4ACA6A6151428364: PUBLIC.ROOM_CHAIR FOREIGN KEY(CHAIR_ID) REFERENCES PUBLIC.CHAIR(ID)"; SQL statement:
ここからid =?バージョン=? [23503-164]
私はこの論理を椅子とは別にしたいと思っています。
椅子がルームを見ることができるように気にしなかったら、これはずっと簡単になります。 – Gregg