2014-04-29 118 views
0

我使用Grails 2.2.4Java 7(這些是我無法更改的約束)創建應用程序,當嘗試刪除多對多關係中的多個條目時,許多人有許多集合。從Grails一對多關係中刪除多個項目

我有一個名爲Sport類,它包含以下內容:

Class Sport{ 
    String name 
    static hasMany=[category:Category] 
    static belongsTo = [Category] 
    } 

而另一個名爲Category

Class Category{ 
    String name 
    static hasMany=[sports:Sport] 
    } 

現在,當我CategoryController我嘗試從sports刪除多個Sport的情況下,我的代碼編譯並運行沒有錯誤,但出於原因,只有一個選定的實例被實際刪除。

如果我從一個形式得到Sport列表和Category ID和嘗試在列表中的每個客體運行下面的代碼:

def categoryInstance = Category.get(idCategory) 
    def sportInstance = Sport.get(idSport) 
    if(sportInstance!=null){ 
     categoryInstance.removeFromSports(sportInstance) 
    } 
    categoryInstance.save() 

只有最後一個實例被刪除。

如果我運行

def categoryInstance = Category.get(idCategory) 
    def sportInstance = Sport.get(idSport) 
    if(sportInstance!=null){ 
     categoryInstance.removeFromSports(sportInstance) 
    categoryInstance.save() 
    } 

只有第一個被刪除。

請注意,此代碼在params.sport.toList()列表中從for循環內運行。

我的猜測是,這是由於我的運動集在第一次刪除之後以某種方式「更改」,因此Hibernate無法找到下一個實例,或者我的保存方法提交了第一個更改,然後「忘了「下一個。

有關如何一次刪除多個實例的任何建議?

+0

閱讀本文應該幫助http://spring.io/blog/2010/07/02/gorm-gotchas-part-2/ –

+0

感謝您的回答,我不是想刪除實際的運動數據庫中只有一個類別和(多於)其中一個相關體育項目之間的關係。 –

回答

0

一種解決方法是換行代碼爲withNewSession + withNewTransaction

Sport.withNewSession { 
    Sport.withNewTransaction { 
     //delete 1 association here 
    } 
} 

塊這不是很優雅,但工作刪除單個關聯。注意潛在的性能影響,因爲這可能會有很多數據庫往返。 我不知道爲什麼會出現這個問題,並且使用谷歌搜索也沒有幫助。

另一種解決方法=解決方法是將關係顯式映射爲SportCategory,然後您可以像使用SportCategory.delete()一樣刪除任何其他對象。

相關問題