[Seasar-user:3601] Re: [S2Dao]N:1マッピングについて

Hikaru Taniguchi [E-MAIL ADDRESS DELETED]
2006年 5月 11日 (木) 10:29:12 JST


谷口です。

筒井さんが仰られているような「N:1関連のネストをどこまでつなぐか」を制
御することは出来ないのですが、

  Hoge   --N:1--  Fuga  --N:1--  Moge

のような関連を一発取得するために以下のような方法を取っています。
ただし、「修正している対象のクラス」がクラスの責務・凝集度からみてあま
り推奨されたものではないので、あくまでこんな例もあるよということで…

(1) 使っているDBMS(以下 例として Oracle)の
	org.seasar.dao.dbms.Oracle
    をextendsしたクラスを1つ作る
(2) createAutoSelectFromClause()メソッドをオーバーライドし、たとえば以
    下のようにする. 修正箇所は2つ下のネストのfor (j=..)の部分です

---
            for (int j = 0; j < rpt.getKeySize(); ++j) {
                String mykey = rpt.getMyKey(j);
//                if (mykey != null && mykey.charAt(mykey.length()-2) == '_' &&
//                        Character.isDigit( mykey.charAt(mykey.length()-1))) {
                if (mykey.lastIndexOf(".") == -1) {
                    whereBuf.append(myTableName);
                    whereBuf.append(".");
                }
                whereBuf.append(rpt.getMyKey(j));    
                
                whereBuf.append(" = ");
                whereBuf.append(yourAliasName);
                whereBuf.append(".");
                whereBuf.append(rpt.getYourKey(j));
                whereBuf.append("(+)");
                whereBuf.append(" AND ");
            }
---

(3) s2daoのdbms.propertiesを見つつ、Oracleクラスへの参照を自前のクラス
    への参照に書き換える

    Oracle=my.package.somewhere.Oracle

(4) A --N:1-- B --N:1-- C   の Aのエンティティにあたるクラスを以下のよ
    うにする

    Aクラスの中に  private B b; + setter を用意
    Aクラスの中に  private C c; + setter を用意

    public static final int b_RELNO = 0;
    public static final int c_RELNO = 1;
    
    public static final String c_RELKEYS = "a.SOMEID:CSID";


・・・という形で(ちょっと対象にしているs2daoのバージョンが古い(1.0.28?)のでズレ
てるかもしれません)使用しています。

かなりゴテゴテした対応ですがいまのところ問題はありません。
# SQLの生成部分はもう少し注意深く考察したほうがいいような気もしていま
# す

とりあえずこんな例もありますよ,ということで...
ズレてたらゴメンナサイ。

At Thu, 11 May 2006 05:49:08 +0900,
上原 慶三 <[E-MAIL ADDRESS DELETED]> wrote:
> 
> 上原です。
> 筒井 勉 wrote:
> > はじめまして筒井と申します。
> > S2DaoでのN:1マッピングについて質問させて下さい。
> > 
> > (1)3つのテーブル(T1,T2,T3)があり、T1とT2およびT2とT3のそれぞれにN:1関連
> > があります。
> > 
> > (2)Daoのメソッドとしては、以下の2つが必要です。
> >  a. T1とT2の情報を取得する。(sql文はs2daoによる自動生成)
> >  b. T1とT2とT3の情報を取得する。(sql文はsqlファイルに記述)
> > 
> > 上述のような条件の場合、作成すべきJavaBeanは以下のようになると思います。
> > そうすると、T1,T2を表すものとT1,T2,T3を表すものの2種類のBeanが必要になり
> > ます。Beanとしては、T1,T2,T3を表すものを1つ用意し、T3の情報についてはDao
> > のメソッドにより取得したりしなかったりしたいと考えています。現状では、T3
> > のRELNO定数を指定した時点で、S2Daoのsql生成時にT1とT3が結合されてしまう
> > ので実現ができないようです。
> > やはり、Beanを2つ用意するのが正しいのでしょうか。アドバイス頂ければ幸い
> > です。
> > (sql自動生成時に含めないRELNO定数みたいのがあればなと考えていました)
> > 
> > 
> > (2-aの場合)
> >  ・T1用Bean(B1)にT2用Bean(B2)を含める。
> >  ・B1にT2用のRELNO定数およびRELKEYS定数を記述。
> > 
> > (2-bの場合)
> >  ・T1用Bean(B1)にT2用Bean(B2)およびT3用Bean(B3)を含める。
> >  ・B1にT2用およびT3用のRELNO定数を記述。
> > 
>  すいません、現状ではN:1マッピングでのネスト(T1:T2=N:1 かつ T2:T3=N:1)
> はできないようになってます。
> 
>  もし自分がやるとしたら、
> T1用のdaoとT3用のdaoを用意して、
> a. の場合は普通にT1用のdaoのN:1の機能を利用し
> b.の場合はT1用のdaoからT1、T2を取得したのちにT3用のdaoからT3を取得して
> T2にT3をセットする関数をじぶんで書くでしょうか。
> 
>  他にもっといい方法があれば教えてください。
> -- 
> ---
> 上原 慶三<[E-MAIL ADDRESS DELETED]>

--
Hikaru Taniguchi <[E-MAIL ADDRESS DELETED]>



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