- PR -

EntityBeanにおけるCMRについて

1
投稿者投稿内容
(株)ぽち
ぬし
会議室デビュー日: 2002/09/10
投稿数: 376
投稿日時: 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
投稿数: 10
投稿日時: 2003-03-31 11:42
はじめて投稿します、にっくです。

ぽちさん、

AとCの間にCMRのリレーションを設定すればよいと思いますが
どうでしょうか?
七味唐辛子
ぬし
会議室デビュー日: 2001/12/25
投稿数: 660
投稿日時: 2003-03-31 12:00
viewを使うといいかも
(株)ぽち
ぬし
会議室デビュー日: 2002/09/10
投稿数: 376
投稿日時: 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
投稿数: 10
投稿日時: 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を作ってくれます。
(株)ぽち
ぬし
会議室デビュー日: 2002/09/10
投稿数: 376
投稿日時: 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

スキルアップ/キャリアアップ(JOB@IT)