2011-08-11 33 views
1

這可能是一個新手的錯誤,所以請原諒我提前。我已搜查高和低的解決方案,但是沒有結果 - 所以我thourght我想在這裏補充我的第一篇:-)問題與Grails中刪除對象 - 慢,還沒有真正刪除

我有兩個領域類,一個叫域和一個叫做頁。如下面的代碼所示,該域有許多頁面。

class Domain { 
      ... 
    static hasMany = [ pages : Page, ... ] 
    static mapping = { 
     pages lazy:true 
    } 
} 

class Page { 
    String identifier 
    ... 
    static belongsTo = [ domain : Domain ] 
    static hasMany = [ ... ] 
    static constraints = { 
     identifier(blank:false, unique:'domain') 
    } 
    static mapping = { 
     ... 
     domain lazy:true 
    } 
} 

我的應用程序有一個很長的算法,其中包括創建頁面的域。如果您用相同的參數以前運行的算法,它將被刪除再次運行算法之前,由以前的運行創建的所有頁面開始。

我有兩個問題:

問題#1 當我刪除一個域中的特定頁面使用:

def domain = page.domain 
domain.removeFromPages(page); 
page.delete() 
domain.save(flush:true) 

這使得Hibernate來獲取並加載域,最終的所有頁面激發數千個查詢(該域有許多頁面)。我如何提高性能? - 直接執行sql刪除頁面使數據庫和休眠狀態不同步。

問題#2 當我後來又創建的頁面:

def page = new Page(identifier:'...').save(failOnError:true) 

我得到:

org.hibernate.NonUniqueObjectException: a different object with the same identifier value was already associated with the session 

歡迎任何幫助 - 我在這裏失去了我的腦海: -/

回答

0

對於批量刪除,請參見IntelliGrape

,我不得不獲取和存儲在遠程系統存儲假期,並在每個取刪除我的本地存儲,這想出了這樣的那些:

Holiday.list()*.delete(flush:true) 

的*是所有魔術發生。請注意,您可以使用list()方法限制要刪除的項目數。

在一個批次,請注意,您還可以使用以下方法來執行批處理。

def session = sessionFactory.openSession() 
def tx = session.beginTransaction() 

... 
for(holiday in holidays) { 
     def h = new Holiday(..) 
     session.save(h) 
} 
sessionFactory.currentSession.flush() 
tx.commit() 
+0

嗨,THX了很多響應。但是其他答案指出,性能部分不是批量刪除的問題,而是更多的關係問題。但戰爭尚未結束。即使我正在使用page.delete(flush:true)刪除頁面,並且在無法獲取已刪除頁面後的行中 - 它仍然存在。因爲當我以後想要再次創建頁面時,我得到了「org.springframework.orm.hibernate3.HibernateSystemException:具有相同標識符值的另一個對象已經與會話相關聯」 – Krauw

1

我會建議考慮一下你的類的一個小的重新設計。 首先,從「域」刪除的網頁收集

Class Domain { 
    // no pages here 
} 

然後把一個簡單的參考,以「域」,在「頁面」

Class Page {  
    String identifier 
    Domain domain 
    ... 
} 

這使得你的頁面的處理更容易。 我不知道這是不是真的適合你的選擇,因爲你必須修改現有的代碼,但它可以爲你節省很多的麻煩與大集合。關於這個也有一個presentation by Burt Beckwith

+0

嗨,是的,我已經看到過那個技巧。所以我實現了這種關係。這在刪除頁面時肯定會增加我的性能問題。我仍然有問題#2。我正在用page.delete(flush:true)刪除頁面,如果我嘗試在下一行查詢頁面,我會得到零點擊。但大概十行之後,我決定再次創建頁面並獲取「org.springframework.orm.hibernate3.HibernateSystemException:具有相同標識符值的不同對象已與該會話關聯」:-( – Krauw