EJBのSessionBeanと普通のJavaクラスのアクセスについて

このQ&Aのポイント
  • EJBを作る際にはSessionBeanを使用しますが、DBにアクセスするために普通のJavaクラスを作成すると怒られることがあります。
  • 普通のクラスを使用することは間違いではありませんが、EJBのセキュリティやトランザクション管理などの機能が利用できなくなる可能性があります。
  • EntityやSessionなどの特殊なEJBの場合、新しくHomeやRemoteなどのインタフェースが必要となる場合があります。
回答を見る
  • ベストアンサー

EJB(Enterprise Java Beans)のSessionBeanと普通のJavaクラスのアクセス

こんにちは! 問題は山のようにあるんですが、とりあえず、 EJBを作る際にSessionBeanを作ったんですが、そのBean以外に DBにアクセスするクラスを自分で勝手に作ったら”abstract”だと 怒られるのですが、 ・普通のクラスを使用するのは根本的に間違ってるのでしょうか? また、 ・他にEntityなりSessionなり(よく違いを理解していなくてすいません・・・) でやる場合は、やはり新しくHomeやRemoteが必要なのでしょうか? 以上なんですが、わかる方がいらっしゃたらお願いします。 ※番外編なんですが、もしAPWORKS(富士通さんの)お使いの方いらっしゃいま したら、EJBを作る時の新規DAクラス作成方法を教えてください。 ながながとすんません。。。でした

  • Java
  • 回答数2
  • ありがとう数7

質問者が選んだベストアンサー

  • ベストアンサー
  • rabbie
  • ベストアンサー率51% (16/31)
回答No.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) というのも分からないでしょうか。 また何か違う事を答えているかもしれませんが、そうしたらまた言ってください。

appipi
質問者

お礼

たびたびありがとうございます。 違いがあまりよく分からなかったのですが(ごめんなさい。。。)、 Beanから普通のJAVAクラスを呼び出して(newして) そのクラスで処理させるというようなことを考えていたんですが、 うーん、やはり同じコンテナ内において 使うとかは無理なのでしょうね。 今は、時間の都合でEJB間通信をしてしまって abstractが出たときの状態もわからなくなってしましました。。。 (とてもがさつなもんですいません。。。) でも、なんとなくですが理解しました。 何度もご親切にありがとうございました。

その他の回答 (1)

  • rabbie
  • ベストアンサー率51% (16/31)
回答No.1

APWORKS は使った事は無いのでちがっていたらすいません。 まず、「普通のクラスを使う事」とは「DBにアクセスする場合には」という事で聞いてらっしゃると思いますが、どんな目的にしろ問題ありません。デザイン的にはという事であれば、それは場合によりけりだと思いますが、EJB はビジネスロジックだけいれてDBアクセスはそれ以外のクラスで、と言うこともよく考えられる事ではないでしょうか。 "abstruct"だと怒られるのは .java のコンパイル時だと思いますが、jbActivate() など SessionBean の interface に含まれるメソッドをインプリメントしていないのではないでしょうか。中身は何も無くても作っておかなければなりません。 public void ejbActivate() throws RemoteException { } 等。 つぎに、Home や Remote がいるかとの事ですが、これが無いものは EJB とは呼ばれない言うのが答えだと思います。

appipi
質問者

お礼

どうもすいません! 先日返事を出したはずだったんですが、 今日見たら何も表示されていなかったので、また改めました。 >EJB はビジネスロジックだけいれてDBアクセスはそれ以外のクラスで、と 言うこともよく考えられる事 それ以外のクラスとはやはりEJBになるんでしょうか? >ejbActivate() など SessionBean の interface に含まれるメソッドをインプ リメント・・・ の部分は、一応APWORKSの方で自動生成してくれるのでいました。 >Home や Remote がいるかとの事ですが、これが無いものは EJB とは呼ばれ ないと言うのが答えだと思います の部分なんですが、私の言い方が悪かったのかもしれないんですが、 Home,Remote,BeanとあるEJBのBeanにだけアクセスするようなbeanのクラスも EJBの形にしなければならない、つまりEJB間でしかやれないんでしょうか? ということだったんです。 とにもかくにもいろいろとありがとうございました。 あつかましくもまたいろいろと書いてしまいましたが、 時間があるときにでもお返事をいただけたらと思います。

関連するQ&A

  • EJBセッションBeanとEJBエンティティBeanについて

    はじめまして。 質問があります。 参考書によくEJBセッションBeanやEJBエンティティBeanという 用語が出てくるのですが、これらは一体何者なのでしょうか? 自分で作るJavaBeansなのでしょうか?それとも すでに開発現場などで使いそうな機能を実装したコンポーネント で、開発者はただそれを使用するだけのものなのでしょうかつまり 出来あいのコンポーネントなのでしょうか? どうかご教授お願いします。

    • ベストアンサー
    • Java
  • EJBコンテナ。

    OJT期間中でサーバサイドを勉強中です。 アプリケーションサーバーの使用で組んだEJBをデプロイ(配置ですか)したときのコンテナの動作を知りたいです。 ちなみに基本的にアプリケーションサーバはオートデプロイで、jarファイルを当該ディレクトリに置いたとき、自動的にEJBが認識されます。 そもそも、EJBのコンテナとは、アプリケーションサーバにEJBが認識された時に作られるものなのでしょうか? クライアントからEJBの機能を呼び出そうとしたときにコンテナを意識したことはありませんが、参照の取得の過程でHomeインターフェース、Remoteインターフェース、Beanは一体どのような過程を辿ってインスタンスを生成し、実行可能状態に至るのでしょうか? また、Beanで実装したビジネスメソッドを実行する過程はどのようなものでしょうか?(まぁ、インスタンスが生成されれば普通にメソッドが呼び出されるのですが) 内部の概念の部分で、知る必要がないかも知れませんが、知りたいのでぜひ教えてください。 ちなみに java.sun.com のサイトにあるj2eetutorial を見て勉強中ですが、そこの説明は表層的なもののようでよくわかりません。 それと、余裕がありましたら、複数のサーブレットに渡って一つの EJB インスタンスを使用する方法(Sessionに設定する以外に)を教えてください。 いまいちよく分かっていないので、質問内容が的外れになっているかも知れませんが、よろしくお願いします。 説明するのが面倒くさいという方は解説のあるページを教えていただくだけでも結構です。

    • ベストアンサー
    • Java
  • BeanにてのDB接続方法

    こんばんは、こちらの皆様には大変お世話になっております。 早速ですがまた質問です^_^; 今MVCモデルを使って社員データをDBにいれる簡単なプログラムを作っているのですが、DB接続がうまくいきません。というよりも私の考え方で合っているのかが定かではないのですが…。 BeanのほうでDB接続のメソッドを作って、それをサーブレットで使おうと思っているのですが、Beanクラスのコンパイルができないんです。(画面表示担当のJSPから直接DBへ接続するぶんにはなんの問題もありません) Beanにはいろんなメソッドを作るつもりで、DBへの指示のSQL文も一つ一つメソッド(データを追加したり、削除したり)を作るつもりでいます。 問題はメソッドの中でDB接続の処理をしてしまうと、別のメソッドでStatementオブジェクトが使えなくなってしまうことです。 DB接続のメソッドは戻り値も引数もなく、DBへ指示を出すメソッドはその時々に合ったものにしようと考えています。この引数をうまく使うのかなぁ、と思いつつも良い案が浮かびません。それとも根本的に考え方が間違っているのでしょうか? 皆様お忙しいとは思いますがご教示のほど、宜しくお願いいたします<(_ _)>

    • ベストアンサー
    • Java
  • 「オブジェクト志向」の考えかたで質問します。

    「オブジェクト志向」の考えかたで質問します。 いろいろと調べると、 ・繼承 ・カプセル化 ・ポリモーフィズム を総称したのが、「オブジェクト」志向と理解しています。 このとき、 たとえば、 指定するクラスの生徒の情報をとりだすようなソースをつくりたい。 仮に、以下をかんがえてみました。 DB処理は、省いてます。 //実行DAOクラス public class StudentDAO extends StudentDBAccessor{ //指定するクラスに属する生徒をとりだす public List getStudentList(int classNumber){ return super.getStudentList(); } //sql文生成 protected String createSqlSelectStudentList(){ StringBuffer sb = new StringBuffer(); return sb.toString(); } //キーワードを設定 public void setDataSqlStudentList(){ } } public abstract StudentDBAccessor extends DBConnector{ protected List getStudentList(){   //DBそうさ } protected abstract String createSqlStudentList(); protected void setDataSqlStudentList(int classNumber); } //DB接続クラス public class DBConnector{   //省略 } //Beanクラス public class StudentFormBean{ private int studentNumber; private String studentName; public void setStudentNumber(int number){ this.studentNumber = number; } public int getStudentNumber(){ return studentNumber; } } よろしくおねがいします。

    • ベストアンサー
    • Java
  • O/Rマッピングを実践されている方へ

    O/Rマッピングを実践されている方へ O/Rマッピングを使うとどんないいことがあるの でしょうか? 私は、普段、JDBCとOracleのストアドプロシージャ を使っていますが。 最近、O/Rマッピングという言葉を聞くようになり、 EJB関連の本を少し読んでみましたが・・ でも、結局EJBの定義の中で ejb-ql というような ものがあって、そこにSQLのようなものを 記述するようになっていることを知りました。 Entitiy Beanに対して set~したり、 get~したり、するだけで あとは EJBコンテナが勝手にやってくれるし、 トランザクション、排他制御等は、 EJBコンテナにお任せして、 やりたいロジックだけ書けばよいとか、 みたいな夢のような話が書いてあります。 本に書いている例では1つのテーブルに対して、 read, writeしている例ぐらいしか。 のっていません。 「そんな単純な例だったら、あんまり恩恵がないなぁ。 設定ファイルを編集する手間が増えるだけ じゃないか。とさえ感じています。」 実際の業務アプリケーションでは、 DBから情報を取得するために 複数のテーブルを結合します。 SQL自体のパフォーマンスを あげるために、かなりコスイことを しなければならないし・・ モデルを実装するクラスの 検索系のロジックが複雑になってしまいます。 更新系であっても排他制御について考える必要があります。 あと、メモリ上にあるJavaBeanの構造が複雑に なってしまいますし、 メンテナンスも大変です それらの煩雑した状態がO/Rマッピングを 使うと、解決されて、 パフォーマンスも実用に耐えうるんでしょうか? だとすれば、なぜ?

    • ベストアンサー
    • Java
  • MVCモデルのJSPの使い方

    こんにちは。二回目の質問をさせていただきます。 今MVCモデルとJDBCで、社員データをDBにいれる簡単なプログラムを作ろうとしているのですが、初期の段階で躓きました。 サーブレットにてBeanをSessionに関連付けているのですが、いざJSPにてBeanを使おうとするとエラーが出るのです。 JSPのコードは冒頭部分にきちんと下記のものを記述し、 (Beanクラス名はFileBeanです。サーブレットできちんとSessionで関連付けています) <jsp:useBean id="bean" class="FileBean" scope="session" /> JSPの中で、Beanのメソッドを使うようにしているのですが下記のようなエラーが出てしまいます。 org.apache.jasper.JasperException: JSPのクラスをコンパイルできません注: sun.tools.javac.Main は推奨されません。 JSPファイル: /Nyuryoku.jsp の中の行: 3でエラーが発生しました 生成されたサーブレットのエラーです: C:\Apache Tomcat 4.0\work\localhost\SyainData\Nyuryoku$jsp.java:65: クラス org.apache.jsp.FileBean が見つかりません。 FileBean bean = null; ^ 因みに参考書のもので試してみたところ、JSPにおいてBeanを使おうとすると空のHTMLが吐き出され、ブラウザには真っ白な画面が表示されます。JSPのBeanの部分を削除すると、ブラウザには普通にHTMLの部分が表示されるのです。 以上二つのことから、JSPでのBeanの使い方がおかしい、というのはわかったのですが、自分でどう解決して良いのかわかりません。特に参考書のコードはちゃんと市販されているものなので、問題ないと思うのですが… 最後になりましたが、私の環境は Tomcat4.0 で OSはMEになります。 皆様お忙しいとは思いますが、ご教示の程宜しくお願い致します<(_ _)>

    • ベストアンサー
    • Java
  • DAOと呼ぶべきか、何と呼ぶべきか

    やや抽象的な質問です Tomcat+Struts+Hibernate+PostgreSQL でWEBプログラムを書いています。 DBについて、Hibernateを使う前は JDBCを直接叩いていましたが、その部分は DAOとしてまとめて特定のクラスに役割を持たせていました。 現在は、その処理はHibernateに任せていますが、それでもすべてのクラスからHibernateを叩くわけでもなく、例えば会員管理をするとして、会員テーブルに対するトランザクション一般を特定のクラスに役割を持たせたくなります(POJOをエンティティにする分には不要ですが、SELECTなどで結局SQLを書く以上、欲しくなる)。 まさに今そういうクラスを作ろうとしていますが、そのクラス名で悩んでいます。 例えば、会員テーブルに関するHibernateへの手続きをまとめたクラスの名前を "UserDAO" のようにするべきか、それだといかにもJDBCを直接叩くクラスだと誤解されやすいか、どうでしょうか。 あるいは、"DAO"の解釈など、根本的に勘違いをしていますでしょうか。 "UserTableLogic"なんていうクラス名でもいいかも知れませんが、どうも散文的な感じがします。 「そんなんどうでもいいじゃん」と言いたくなる気持ちを抑えて是非ご教授下さいませ。

  • EJB

    JavaBeansとEJBの違いについて(まったく異なる ものでしょうが。。)教えていただきたいのですが。。 もしくは分かりやすいページを教えてください。 JavaSolutionなどを参考にしましたが いまいちよくわからなかったので。。。

    • ベストアンサー
    • Java
  • Java:クラスをたくさん使ったプログラミング?

    Java言語勉強中のものです。 Eclipseをつかっています。 初心者ですので、易しい言葉でご回答いただければ幸いです。 Javaの基礎についてひととおり勉強しました。 オブジェクト指向についても、だいたい・・なんとなくは理解できていると思います。 ただ、自分で作成するときに、 うまくオブジェクト指向を取り入れたプログラミングができません。 なんだかあっちこっちのものを呼び出してきてとてもややこしいです。 クラスがたくさんつかわれているプログラムは、 ほかの人がつくったプログラムをなんとかがんばって読む、というのが精一杯です。 自分ではとても思いつかない構造ばかりです。 あっちこっちからよんできているので、図やらリストやらを書いて 本当に「なんとか」理解できた、というレベルです。 クラスが5個以上になると正直もう嫌だってなります。。実用レベルにはまだまだ至っていません。 本当の意味でオブジェクト指向を理解できていないのかもしれません。 どうすればそういった、オブジェクト指向をとりいれたプログラムが書けるようになるのでしょうか? いろんなプログラムを見る、数をこなすことでしょうか? 何かおすすめの参考書や、 「こういう考え方をすれば・・・」というものがありましたら教えてください。 よろしくお願いいたします。

    • ベストアンサー
    • Java
  • boolean を返すクラス(Java)

    JAVAについての質問です。 Java versionは1.6.0_43で、 BlueJ versionは3.0.8です。 これはDriveです↓ Temperature t1 = new Temperature (); Temperature t2 = new Temperature ('F'); t2.setTempObj(32.0); System.out.println ("Does 0C equal 32F: " + t1.equals(t2)); そしてこれがクラス↓ public boolean equals(Temperature testObj) { return //ここにいれるものがなにかわからない。 } アウトプットはtrueです。 booleanのところがdoubleとかなら入れものがわかるのですが、 trueかfalseの場合分けみたいなときはなにを入れたらいいのでしょうか? if文をいれようとも考えましたが結局意味がわからず終いでした。 必要な情報があったら言ってください。 乱文ですが、よろしくおねがいします。

    • ベストアンサー
    • Java