2010-06-03 43 views
0

我有一個數據庫,它類似於以下內容:iBatis的如何解決更復雜的N + 1個問題

create table Store(storeId) 
create table Staff(storeId_fk, staff_id, staffName) 
create table Item(storeId_fk, itme_id, itemName) 

Store表大。

而且我已創建了以下Java bean的

public class Store 
{ 
    List<Staff> myStaff 
    List<Item> myItem 

    .... 
} 

public class Staff 
{ 
    ... 
} 

public class Item 
{ 
    ... 
} 

我的問題是如何使用iBATIS的結果地圖有效地從表到Java對象映射?

我想:

<resultMap id="storemap" class="my.example.Store"> 
    <result property="myStaff" resultMap="staffMap"/> 
    <result property="myItem" result="itemMap"/> 
</resultMap> 

(other maps omitted) 

但它太慢,因爲Store表是非常非常大的。

我試圖按照克林頓的開發者指南爲N + 1個解決方案的例子,但我不能彎曲我的腦海裏圍繞着如何與2列表中使用的「GROUPBY」的對象...

任何幫助感謝!

回答

1

當你開始想要加載一個對象圖時,你開始明白爲什麼iBatis不是一個ORM,只是一個對象映射器。你是對的,用iBatis的groupBy特性加載映射關係(避免N + 1問題)的配方難以概括爲你的場景。我認爲這可以做到,但我不會打擾。

通常在這裏實現一些延遲加載,或者顯式加載相關對象。不管怎樣,我不確定你的目標是什麼。你說「店面表非常大」。 現在,您是否打算加載許多Store對象?你真的需要相關的對象嗎? 問自己(用iBatis設計時)什麼是理想的SQL執行。

不要忘記,可以有不同的場景來處理你的對象,並不是所有的場景都必須使用相同的映射。

例如,經常有兩種類型的與Store對象相關的用例:在第一種類型中,需要加載完整的「對象圖」,但僅用於一個(或幾個)根對象(一個Store );在另一種類型中,必須裝載許多「商店」(具有相關數據),但僅用於一些列表或報告。然後,你可以做各種不同的事情:首先,用相關的對象加載完整的對象(也許延遲加載,而不用擔心N + 1問題);在第二種情況下,實際上並沒有加載完整的Store對象圖,而只是一些虛擬的StoreWithExtraData DTO對象(可能甚至是純粹的HashMap!),它們對應於列表的一行 - 並且可以在iBatis中使用ad-臨時SQL查詢和映射。

+0

感謝您的建議,我重新考慮了我的問題,並針對我的問題提出了不同的方法,它幾乎與您的建議保持一致。我試圖讓我們把iBatis當作休眠,但我錯了! – Alvin 2010-06-08 08:09:09

相關問題