2013-10-07 2 views
1

У меня есть 2 класс домена со многими для многих отношений. Когда я удаляю объект, который принадлежит другому, я должен удалить отношение раньше, чтобы избежать ошибки внешнего ключа. Эти отношения связаны через третий класс, третью таблицу в MySQL.Groovy/Grails many-to-many delete relation

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] 
} 

Поэтому, когда я удаляю связь между двумя классами, он удаляет только одно отношение. Я имею в виду, если у нас есть 1 Город и 1 Лицо, и попробуйте удалить этот Город, приложение функционирует нормально. Но если у вас более одного человека, прикрепленного к городу, у нас будет: «Невозможно удалить или обновить родительскую строку: сбой внешнего ключа». Но одно отношение удаляется. Если я попытаюсь удалить город еще раз, второе лицо будет удалено. Мое приложение ведет себя так, пока последнее Лицо не будет удалено. Таким образом, метод 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 «Невозможно бросить объект„mypackage.Visit: 1“с классом„mypackage.Visit“в классе» java.util .Коллекция'. Любые мысли и помощь высоко оценены.

ответ

0

Вы пробовали следующее? В теории должно работать ...

class City { 
    String nameCity  
    static hasMany = [visits:Visit] 



class Visit {  // it is the relation class 
    City city 
    Person person 
    static belongsTo = [city:City, person:Person] 
} 

class Person { 
    String namePerson 
    static hasMany = [visits:Visit] 
} 

И просто сделайте нормальное удаление. Таким образом, если вы удалите Город или Лицо, все связанные с ним посещения будут удалены.

+0

Теперь он функционирует безупречно. И решение проблемы настолько короткое и приятное. Спасибо, Эйлен! –

Смежные вопросы