多対多の関係を持つ 2 つのドメイン クラスがあります。他のエンティティに属するエンティティを削除する場合、外部キー エラーを回避するために、事前に関係を削除する必要があります。これらの関係は、MySQL の 3 番目のクラス、3 番目のテーブルを介して接続されます。
class City {
String nameCity
static hasMany = [visits:Visit]
/* FIRST VARIANT. REMOVES ONE VISIT ONLY */
def beforeDelete() {
Visit.withNewSession {
def visitList = Visit.findByCity(this)
visitList.each { it.delete(flush: true) }
}
}
}
//_____________________________________________
class Visit { // it is the relation class
City city
Person person
}
//_____________________________________________
class Person {
String namePerson
static hasMany = [visits:Visit]
}
したがって、2 つのクラス間の関係を削除すると、1 つの関係のみが削除されます。つまり、1 つの City と 1 Person があり、この City を削除しようとすると、アプリは正常に機能します。ただし、City に複数の Person が関連付けられている場合は、「親行を削除または更新できません: 外部キー制約が失敗します」というメッセージが表示されます。ただし、1 つの関係が削除されます。City をもう一度削除しようとすると、2 番目の Person が削除されます。私のアプリは、最後の Person が削除されるまでそのように動作します。したがって、 beforeDelete() メソッドはうまく機能します。私の問題は、関係のコレクションを作成し、それらをすべてサイクル (ループ) で削除する方法を理解していないことです。私がこのようにすると:
class City {
String nameCity
static hasMany = [visits:Visit]
/* SECOND VARIANT. TYPE CAST EXCEPTION */
Collection<Visit> visitList() {
Visit.findByCity(this)
}
def beforeDelete() {
Visit.withNewSession {
visitList().each { it.delete(flush: true) }
}
}
}
org.codehaus.groovy.runtime.typehandling.GroovyCastException 'Cannot cast object 'mypackage.Visit : 1' with class 'mypackage.Visit' to class 'java.util.Collection'. どんな考えや助けも大歓迎です。