2010-06-03 49 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

相关问题