iBATISで1:Nの関連を扱う方法

iBATISで1:Nの関連を扱う方法
その1)Lazy Loadingを利用


親テーブルのみをSelectし、親オブジェクトを生成
子テーブルへのSelectは、子オブジェクトへのアクセ
スが発生した時点でiBATISが暗黙的に行う
その2)SqlMapのgroupbyを利用


親テーブルと子テーブルをjoinして、一気に取得
親オブジェクトの集約はiBATISが自動的に行う
SqlMapのgroupby機能
PRODUCT
CATEGORY
PROD_ID
PROD_NAME
CAT
CAT_ID
CAT_NAME
101
Gym
1
1
EFF
102
Ball
1
2
ZION
201
Zaku
2
202
Gufu
2
203
Dom
2
Java Objects
:Category
catid=1
name=“EFF”
SELECT CAT_ID, CAT_NAME, PROD_ID, PROD_NAME
FROM CATEGORY, PRODUCT
WHERE CAT_ID = CAT
CAT_NAME
PROD_ID
PROD_NAME
1
EFF
101
Gym
1
EFF
102
Ball
2
ZION
201
Zaku
2
ZION
202
Gufu
2
ZION
203
Dom
:Product
id=102
name=“Ball”
:Product
id=201
name=“Zaku”
groupby=“catid”
CAT_ID
:Product
id=101
name=“Gym”
:Category
catid=2
name=“ZION”
:Product
id=202
name=“Gufu”
:Product
id=203
name=“Dom”
Lazy Loadingとgroupbyの使い分け
どちらもメリット・デメリットがある

Lazy Loading
 ○Joinを行わないのでRDBMSへの負荷が少ない
 ○必要になるまで子オブジェクトを生成しない
 ×(N+1)問題:子オブジェクトは1レコードづつSQLを投げる

SqlMapのgroupby
 ○(N+1)問題と無縁:子オブジェクトもまとめて1回のSQLで
 ×Joinを行うのでRDBMSへの負荷は高くなる
使い分けの基準


子オブジェクトへのアクセスが多い⇒groupby
子オブジェクトへのアクセスが少ない⇒Lazy Loading