[Seasar-user:8708] Re: [S2Dao] 1:Nのマッピングについて
kubo
[E-MAIL ADDRESS DELETED]
2007年 6月 27日 (水) 12:16:09 JST
久保(jflute)です。
> > 今後、1:Nをサポートする予定はあるのでしょうか?
> > また、通常1:Nを実装するときの定石などはあるのでしょうか?
> >
> 1:Nが必要な場合は、DBFluteをご利用ください。
> DBFluteはS2Daoを拡張するフレームワークです。
> http://dbflute.sandbox.seasar.org/ja/index.html
紹介預かりましたので、DBFluteの{1:N}サポートに関してご説明させて頂きます。
ex) BOOK(本:親) -- COLLECTION(蔵書:子)というTable構造があるとして
「1:Nを実装するときの定石」でパッと思いつくのが3つあると思っています。
(無論他にもあるかと思いますが...)
A. BOOK left outer join COLLECTIONでSQL一発取得してEntityにMapping
B. BOOKの一覧を先に取得して、LazyLoadする。
→ 紐付くCOLLECTIONを取得するSQLをそれぞれ発行して取得する。
C. BOOKの一覧を先に取得して、SQLもう一発で紐付くCOLLECTIONを全て取得して
BOOKの一覧とCOLLECTIONの一覧の関連をMappingする。
「A」は理想ですが、S2DaoもDBFluteもサポートしていません。
「B」はまさしく“Apache Torque”がこの実装をしていますが、
極端な話、BOOKが50件の場合、紐付くCOLLECTIONを取得するのに50回のSQLが
発行されることになります(BOOKと合わせると合計51回)。
DBFluteではこの方法は採用しません。
「C」は「A」より理想ではないですが、大抵の業務に耐えうる妥協点かなと
思っております。「SQLもう一発で紐付くCOLLECTION」も
恐らく一般的にINDEXを貼るであろうBOOKへのFKに対してin句で取得するため、
SQLは低速ではありません。
ListとListのMapping処理も「BOOK-1万件でCOLLECTION-8万件をMapping」
という極端な件数でなければ全くPerformance劣化を気にすることはありません。
よって、DBFluteでは「C」を採用しております。
/- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
// BOOKの条件作成(例えば「名前が'S2Dao'で始まる本」という条件)
final BookCB bookCB = new BookCB();
bookCB.query().setBookName_PrefixSearch("S2Dao");
// BOOKの一覧の検索(例えば50件ほど取得) *1発目のSQL
final java.util.List<Book> bookList = bookBhv.selectList(bookCB);
// ★COLLECTIONの一覧を検索してBOOKの一覧とMapping *2発目のSQL
bookBhv.loadCollectionList(bookList);
for (Book book : bookList) {
// BOOKから該当のBOOK_IDに紐付くCOLLECTIONを取得
// (LazyLoadではないので、ここでは単に一覧のInstanceを取得するだけ)
final java.util.List<Collection> collectionList = book.getCollectionList();
for (Collection collection : collectionList) {
... = collection.getXxx();// COLLECTIONの列の値を取得
}
}
- - - - - - -/
子Tableの検索と一覧のMappingに関しては、DBFluteが自動生成したClassで
処理されるため、利用者側は全く意識する必要はありません。
また、「C」のやり方を採用したことにより、1:N:1:1というような取得も可能で
す。
(内部的に実現が容易であったという意味で)
{N:1:1}は「2発目のSQL」で纏めて検索します。
詳しくはこちら参考にして下さい。
http://dbflute.sandbox.seasar.org/ja/tips-behavior-one_to_many_loading.html
何か疑問等ありましたら遠慮なく聞いてください。
よろしくお願いします。
Seasar-user メーリングリストの案内