2010-01-14 50 views
2

我有2個具有一對多關係的域對象。只是作爲一個例子:直接通過grails中的id設置關聯

Class Author{ 
    static hasMany = [posts: Post] 
} 
Class Post{ 
    Author author 
} 

在數據庫中的職位表有一個稱爲AUTHOR_ID場。在我的應用程序中,我有一堆我想與帖子關聯的作者id。我可以這樣做,首先查詢每個作者的數據庫,然後調用author.addToPosts(post)。但是,由於我已經有了作者對象的ID,所以我應該可以直接設置post.authorId = authorId來創建關聯(這是所有的grails都會做的),並減少一半查詢的次數。

在實際應用程序中,我正在寫這樣做會將我需要的查詢量減少大約70%。這是應用程序中的一個關鍵瓶頸,我不能承受差的SQL性能。我可以很容易地編寫一個sql語句來完成這個任務,但我無法弄清楚如何讓grails讓我直接設置author_id來手動創建關聯。在rails中,這種功能是內置於主動記錄的。 Grails可以做到這一點嗎?

回答

4

爲Author創建第二級高速緩存,get()調用將從緩存中檢索,而不是從數據庫檢索(大部分時候緩存中的實例將在編輯時刷新)。那麼淨效應就是你要找的東西 - 作者將被緩存,Hibernate可以使用它來設置Post的外鍵。

+0

有趣。所以實際上,我不需要擔心如何減少所需的查詢數量,作爲使用hibernate進行優化的一種方法,假設我有緩存設置(grails不會自動設置它)?我想我可能會開始明白爲什麼java人談論這麼多關於休眠的話題。順便說一句,你的用戶界面性能插件是驚人的! – 2010-01-14 08:07:22