[Seasar-user:11237] Re: 【DBFlute】BehaviorとDAOの関係について

kubo [E-MAIL ADDRESS DELETED]
2007年 10月 24日 (水) 10:29:20 JST


久保です。

佐藤(聖)さん、こんにちは

> 大変に初歩的な質問でお恥ずかしいですが、
> DBFluteのBehaviorとS2DAO(DBFlute的にはBsDAO、ExDAOパッケージ)
> の関係でご質問です。
> (この後実際にSample等を追って確認するつもりなのですが、ちょっと
>  だけショートカットしようとしてまして・・・)
> 
> DBFluteの役割図、及びS2DAOの役割からすると
> 
> S2DAO→DBとのアクセスの抽象化
> Entity→Query結果(というより単にDomainデータ)の抽象化
> ConditionBean→Queryの拡張
> Behavior→DAOとのFacade
> 
> と、雑ですが思っています。
> 
> BehaviorとDAO、Entity、ConditionBeanは一組のセットだと思うのですが、
> この際DAOLayer全体の利用オブジェクトから見たときに
> DAOの生成は誰の責務になりますか?
> (Behavior or 利用オブジェクトの2択だと思っている)
> 
> イメージだけだとBehaviorが生成も隠蔽(と書くと言葉悪いですが)している
> ように考えていましたが、BehaviorにはDAOをセットするメソッドもあり、
> 悩んでいます。(そして、ちょっと真面目にSampleソースを追う予定です)
> 
> 多分ハイ、イイエというレベルの質問だと思うのですが、
> ご教示いただければ助かります。
> 
> # ちなみにSeasar2(DI+AOP+α)としては使ってなく、DBFlute=S2DAOだけ
> # 使ってたりします。機会があればいろいろフル適用してみたい・・・。

ドキュメントを読んで下さってありがとうございます。

S2DaoのDAOインターフェースは、
Seasar2が生成して、そのインスタンスをBehaviorに渡します。
Behavior自身のインスタンスもSeasar2が生成します。

【Seasar2がやることイメージ】
  Behavior bhv = new Behavior();
  Dao dao = new Dao();
  bhv.setMyDao(dao);

Seasar2を使わずにとのことですが、S2DaoはSeasar2の上で動作しますので、
Seasar2を使わずに動かすことはできません。
ある意味、佐藤さんが疑問に思われた生成の責務や設定の責務をDIコンテナが
解決(隠蔽)してくれていると考えることができます。

「Seasar2(DI+AOP+α)としては使ってなく」という言葉には、
DIコンテナとかの機能は使わないけどDBFlute+S2DAOというO/Rマッパだけ
利用したい、という思いがあるのではないかと勝手ながら想像します。
それはそれで一つのニーズだと思います。

先述の通りSeasar2を全く使わずにS2Daoが動作することは無いのですが、
要は「内部ではSeasar2を使っているけどプログラマは意識する必要がない」
ということであれば、やりたいことが満たせるのではないかと思います。

DBFluteに「BFinder」というクラスがいます。
これを使うと、DIコンテナの存在を意識せずに
「Behavior/Daoの生成・設定」と「Behaviorの取得」ができます。

ex) 会員(Member)というテーブルがあるとして
    MemberのBehaviorインスタンスを取得。

    MemberBhv bhv = BFinder.find(MemberBhv.class);
    Member cb = new MemberCB();
    cb.query().setMemberName_PrefixSearch("Billy");
    Member member = bhv.selectList(cb);

        ↓

    select member.MEMBER_ID, ...
      from MEMBER member
     where memebr.MEMBER_NAME like 'Billy%'

DIコンテナへの意識は、誰か1人が「dbflute.dicon」
と「jdbc.dicon」を整備すれば、他のプログラマは
上記の実装で、DIコンテナの仕組みを意識せずにDBアクセスができます。

但し、もう一つ考慮しなければならないのは、トランザクションです。
コネクションとトランザクションの管理も基本はSeasar2が行うため、
それに準拠したやり方をしないとトランザクションをかけることができません。
そういう意味では、もうひとふんばり、誰か1人がトランザクションを
かける仕組みをアプリケーションのどこかに仕掛けてあげないといけないです。

聞きたいことの答えになっていますでしょうか???
検討違いだったらまたすぐに言ってください。
(遠慮なく聞いてくださって構いませんよ)





Seasar-user メーリングリストの案内