2013-10-07 157 views
1

我有2個具有多對多關係的域類。當我刪除屬於另一個的實體時,爲了避免外鍵錯誤,我必須先刪除關係。這些關係通過MySQL中的第三類,第三表連接起來。Groovy/Grails多對多刪除關係

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個人,並嘗試刪除此城市,則該應用功能正常。但是,如果您有多個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「無法施展對象mypackage.Visit:「帶班‘mypackage.Visit 1’上課」的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

現在它的功能完美無缺。問題的決定是如此短暫而美好。謝謝,艾倫! –