2013-10-07 128 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

现在它的功能完美无缺。问题的决定是如此短暂而美好。谢谢,艾伦! –