1

多対多の関係を持つ 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'. どんな考えや助けも大歓迎です。

4

1 に答える 1