- - PR -
EntityBeanにおけるCMRについて
1
| 投稿者 | 投稿内容 |
|---|---|
|
投稿日時: 2003-03-30 20:26
こんにちわ。
以下のようなEntityがあった場合です。 A B C +-------+ +---------+ +---------+ |id(pk) |____|id(pk,fk)|____|id(pk,fk)| |nameA| |nameB | |nameC | +-------+ +---------+ +---------+ BのidはAのforeign keyです。 CのidはBのforeign keyです。 つまり実質Aのid=Cのidになります。 この場合nameAとnameCを取得したいとすると 通常のJDBCプログラミングによるコードだと "select a.nameA, c.nameB from A a, C c where a.id=c.id" というsqlを発行すれば簡単にできると思います。 #テーブルAとテーブルCのみをjoinして取得できる #ことがポイント しかしEJBのEntityBeanを利用しCMRで表現しようと した場合、疑問がありあます。 CMP,CMRを使うのでsqlコードは全く意識する必要はなく 上記と同様のnameAとnameCを取得したい場合は次のよう になるかと思います。 selectメソッドによりAを取得する nameA = A.nameA; nameC = A.B.C.nameC; このようにBを介してnameCを取得しかないように思える のですが、これは仕方ないでしょうか? そもそも、CMP,CMRを使用した場合は、AとCのみをjoin すれば済むものをコンテナはA,B,C全てをjoinしているのでしょうか。 これは性能にも大きく影響すると思うんですが、CMP,CMRを使用 している場合は仕方ないということでしょうか? ご意見お待ちしております。 よろしくお願いします。 |
|
投稿日時: 2003-03-31 11:42
はじめて投稿します、にっくです。
ぽちさん、 AとCの間にCMRのリレーションを設定すればよいと思いますが どうでしょうか? |
|
投稿日時: 2003-03-31 12:00
viewを使うといいかも
|
|
投稿日時: 2003-03-31 12:38
にっく様
ありがとうございます。 これはjavaじゃなくDBの話になるんですが ・一つのカラムが二つのテーブルからのforeign keyになり得るのでしょうか CのidはBのFKとして定義してあります。 かつ、CのidはAのFKと定義できるのでしょうか? 七味唐辛子様 ありがとうございます。 確かにそういう手がありますね。 検索でjoinするであろうテーブルをあらかじめ viewで作成しておき、EntityBean化していれば 簡単に検索はできますね。 このようなやり方しかやっぱりダメなんですかね。 EntityBeanの縛りというか。 CMRの詳細をあまりわかっていないのでもっと スマートな方法(実装レベル)があるのかと思って いたんですが。 |
|
投稿日時: 2003-03-31 13:41
ぽちさん、
"where a.id=c.id"というSQLでOKということは、DBに外部キー 設定してもしていなくても、スキーマ設計的には"C.idはA.id を参照する外部キー"であると言えます。 であれば、AとCの間にCMRの1:Nのrelationship設定をしておけ ば、WHERE A.id = C.idというjoinのSQLを作ってくれます。 |
|
投稿日時: 2003-03-31 14:48
にっく様
ありがとうございます。 わたしはDBで定義(スクリプトレベルで)できないことは EJBのrelationshipでも定義できないのかなと思っていました。 以下DBのことはほとんど初心者な者の言葉です。 例えば // テーブルBのスクリプト constraint b_pk primary key (id), constraint b_fk foreign key (id) references A(id) // テーブルCのスクリプト constraint c_pk primary key (id), constraint c1_fk foreign key (id) references B(id) constraint c2_fk foregin key (id) references A(id) このようなことはできないと思っていました。 なのでEJBのrelationshipでも定義できないと思っていました。 "スキーマ的に"という言葉の意味がよくわかっていないのですが ちょっと試してみようかと思います。 |
1
