- ベストアンサー
EJBのSessionBeanと普通のJavaクラスのアクセスについて
- EJBを作る際にはSessionBeanを使用しますが、DBにアクセスするために普通のJavaクラスを作成すると怒られることがあります。
- 普通のクラスを使用することは間違いではありませんが、EJBのセキュリティやトランザクション管理などの機能が利用できなくなる可能性があります。
- EntityやSessionなどの特殊なEJBの場合、新しくHomeやRemoteなどのインタフェースが必要となる場合があります。
- みんなの回答 (2)
- 専門家の回答
質問者が選んだベストアンサー
すいません、コンピュータに接続できなかったものですっかり遅くなってしまいました。質問をよく理解していなかったようですね。ごめんなさい。 一応確認ですが、同じサーバーのVM内で EJB の bean と別のクラスのオブジェクトとがアクセスするという事でいいですよね。 こういうことでしょうか?(以下、MyBean を EJB の bean のクラス、MyDbEngine を普通のクラスとします。) 1. MyBean のメソッドの中で myDbEng = MyDbEngine.getInstance(); とか myDbEng = new MyDbEngine(SomeParameters) のようにやって myDbEng.truncateAllTable(); のようにできるか。 2.MyBean のメソッドの中で MyDbEngine.startEngine(this); のようにするとMyDbEngine のほうで myBean = bean のように MyBean のインスタンスのレファレンスを保持してさらに別のスレッドを起動してその中から MyBean のメソッドにアクセスする。ことはできるか。 3.MyDbEngine のメソッドから myBean = new MyBean(); のようにしてこれを利用する。 という事でいいでしょうか。 1.はもちろんOKです。ただ複数の Bean が同時にアクセスすることもあるでしょうから static なデータを持たせる場合には注意が必要です。 2.3.は問題があると思います。EJB の Bean 自体はコンテナ(APWORKS?)が管理するので他からダイレクトにアクセスするのはまずいでしょう。(3.で stateless sessoin bean なら平気なような気もしますが。)この場クライアント側のコードと同じように(JNDIをlookupして)Home を取得してそこから利用しなければならないと思います。ただし、この場合もアクセスする側(MyDbEngine) は EJB である必要は無く、あくまで普通のクラスでかまいません。JSPからEJBを利用する時と同じようなものです。 あと、abstract のほうはちょっとわかりません。何をしたら(javac/ejbc/runtime) 言われるのでしょうか、また、何が(class/method) というのも分からないでしょうか。 また何か違う事を答えているかもしれませんが、そうしたらまた言ってください。
その他の回答 (1)
- rabbie
- ベストアンサー率51% (16/31)
APWORKS は使った事は無いのでちがっていたらすいません。 まず、「普通のクラスを使う事」とは「DBにアクセスする場合には」という事で聞いてらっしゃると思いますが、どんな目的にしろ問題ありません。デザイン的にはという事であれば、それは場合によりけりだと思いますが、EJB はビジネスロジックだけいれてDBアクセスはそれ以外のクラスで、と言うこともよく考えられる事ではないでしょうか。 "abstruct"だと怒られるのは .java のコンパイル時だと思いますが、jbActivate() など SessionBean の interface に含まれるメソッドをインプリメントしていないのではないでしょうか。中身は何も無くても作っておかなければなりません。 public void ejbActivate() throws RemoteException { } 等。 つぎに、Home や Remote がいるかとの事ですが、これが無いものは EJB とは呼ばれない言うのが答えだと思います。
お礼
どうもすいません! 先日返事を出したはずだったんですが、 今日見たら何も表示されていなかったので、また改めました。 >EJB はビジネスロジックだけいれてDBアクセスはそれ以外のクラスで、と 言うこともよく考えられる事 それ以外のクラスとはやはりEJBになるんでしょうか? >ejbActivate() など SessionBean の interface に含まれるメソッドをインプ リメント・・・ の部分は、一応APWORKSの方で自動生成してくれるのでいました。 >Home や Remote がいるかとの事ですが、これが無いものは EJB とは呼ばれ ないと言うのが答えだと思います の部分なんですが、私の言い方が悪かったのかもしれないんですが、 Home,Remote,BeanとあるEJBのBeanにだけアクセスするようなbeanのクラスも EJBの形にしなければならない、つまりEJB間でしかやれないんでしょうか? ということだったんです。 とにもかくにもいろいろとありがとうございました。 あつかましくもまたいろいろと書いてしまいましたが、 時間があるときにでもお返事をいただけたらと思います。
お礼
たびたびありがとうございます。 違いがあまりよく分からなかったのですが(ごめんなさい。。。)、 Beanから普通のJAVAクラスを呼び出して(newして) そのクラスで処理させるというようなことを考えていたんですが、 うーん、やはり同じコンテナ内において 使うとかは無理なのでしょうね。 今は、時間の都合でEJB間通信をしてしまって abstractが出たときの状態もわからなくなってしましました。。。 (とてもがさつなもんですいません。。。) でも、なんとなくですが理解しました。 何度もご親切にありがとうございました。