Java2EE FAQ

Java2EE FAQ

J2EEを学習しているときに出てきた用語の覚書です。FAQ形式にしてみました。
Q.コンテナ管理による持続性とは?

A.EJBコンテナがエンティティBeanからのデータベースのアクセス要求をラップする事。つまりエンティティBeanにSQLが含まれないのでデータベース依存がなくなる。EJBコンテナがデータベースにアクセスするためには、エンティティBeanの抽象スキーマを必要とする。

Q.抽象スキーマとは?

A.エンティティBeanのDeploymentDiscripterの一部。EJBQL(Enterprice JavaBeans Query Language(EJB QL))により参照される。

Q.持続フィールドとは?
Q.関係フィールドとは?
Q.いつエンティティBeanつかえばいい?
A.Beanの情報がデータベースに残されなければならない時
Q.リモートアクセスとは?
EJBが処理されるJVM,または異なるマシンからのアクセスを許可すること。リモートインタフェースとリモートホームインタフェースを定義しなければならない。
Q.ローカルアクセスとは?
ローカルクライアントが同じJVM内で処理されること。ローカルアクセスを許可するには、ローカルインタフェースとローカルホームインタフェースを定義しなければならない。
Q.何故、ローカルインタフェースを定義しなければならないのか?システムの分散を考えるとリモートインタフェースでも使いつづけられるのではないか?
A.リモートインタフェースを使っても記述できるが、基本的にローカルインタフェースのほうがパフォーマンスが高い。
Q.リモートインタフェースとは?
A.Beanのビジネスメソッドの窓口
Q.ホームインタフェースとは?
A.Beanのライフサイクルにかかわるメソッドを定義
Q.リモートアクセスとローカルアクセスを使い分ける目安は?
A.以下が判断基準になると思います。
  1. コンテナ管理によるreleasionの時は、ローカルアクセスを使用しなければならない。
  2. ObjectList(1)<->Objects(n) のように密接な関係がある場合は、ローカルrアクセスを利用
  3. J2EEアプリケーションクライアントがエンタープライズBeanにアクセスするときは、リモートアクセスを利用
  4. コンポーネントを分散したときは、リモートアクセスを利用
  5. 分からないときはリモートアクセスを選択、パフォーマンスは別として、ローカルアドレスでできることはリモートアドレスでも出来るがその逆は否。

/*
 * ユーザを定義したオブジェクト
 */
public class User {
	private String name;
	private String address;
	
	public void setName(String name) {
		this.name = name;
	}
	public String getName() {
		return this.name;
	}
	public void setAddress(String address) {
		this.address = address;
	}
	public String getAddress() {
		return address;
	}
}

/*
 * TestEnterpriceBeanのリモート(ローカル)インタフェース
 */
interface TestEnterpriseBean {
	//リモートアクセス時のパラメータは祖粒度のほうがよい。
	void searchUser(User u);
	
	//ローカルアクセス時のパラメータは密粒度のほうがよい。
	void searchUser(String name, String address);
}
Q.ところでエンタープライズBeanに必要なものはなんですか?
  1. Deployment Discripter
  2. EnterpriseBean class
  3. Interface for EnterpriseBean
  4. Helper class like a exception and utility.
Q.そんなにあると管理するのが大変なんですが?
A.EJB jarファイルとしてパッケージしてアプリケーションサーバに配置します。
Q.ファイル名とかに決まりがありますか?javaのコーディング規約に従えばもんだいないですか?
A.以下のようにするとまとめやすいと思います。
名称サンプル
EJB名HogehogeEJB
EJB JARファイル名HogehogeJAR
エンタープライズBeanクラス名HogehogeBean
リモートホームインタフェースHogehogeHome
リモートインタフェースHogehoge
ローカルホームインタフェースLocalHogehogeHome
ローカルインタフェースLocalHogehoge
スキーマ(Deployment Discripter)Hogehoge
Q.ライフサイクルとは?

Q.ステートレスとステートフルってなに?
A.通信などでデータを渡している間にデータを保持しているかどうか。
有名なところだとHTTPプロトコルはステートレスである。

Q.ステートレスセッションBeanのライフサイクルは?

Q.ステートフルセッションBeanのライフサイクルは?

Q.エンタープライズBeanがnew出来ません。どうしてでしょうか?
エンタープライズBeanはコンテナによってインスタンス化します。一般的には以下のようになります。
1.ホームインタフェースのcrete()をクライアントがコール
2.EJBコンテナがエンタープライズBeanのインスタンス化
3.EJBコンテナがエンタープライズBean#ebjCreate()のコール

Q.何故 newではだめなんでしょうか?
だめなんです。といってしまうとそれまでなんですが、RMIを一度勉強してみることでEJBが理解しやすくなると思います。

Q.getPrimaryKey()ってなんですか?
エンタープライズBeanを比較するためにつかいます。"hoge".equals("fuga")などと同じで比較するために
利用します。

Q.エンタープライズBeanのオブジェクト参照の受け渡しとはなんでしょうか?
リモートインタフェースの参照オブジェクトを渡します。

public class TestObjectReferenceBean implements SessionBean {
	private SessionContext context;
	public void setSessionContext(SessionContext context) {
		this.context = context;
	}
	
	/*
	 * 他のエンタープライズBeanがTestObjectReferenceBeanに参照するために
	 * TestObjectReferenceリモートインタフェースのオブジェクト参照を返す。
	 */
	public EJBOjbect getThisReference() {
		return context.getEJBObject();
		
	}
}
Q.エンティティBeanの戻り値は何でもいいんですか?
戻り値は、primary keyにします。

Q.ejbPostCreate()ってなんですか?
A.EJBコンテナがejbCreate()メソッドの後にcallします。
EJBコンテナがインスタンスを生成した後なので、
EntityContext#getPrimaryKey, EntityContext#getEJBObjectを呼び出すことが出来ます。

Q.ejbLoad(),ejbStore()のつながりは?
A.EJBコンテナがユーザ作成のビジネスメソッドをコールする際に呼び出します。以下のような感じです。

1.EJBコンテナがejbLoad()をコール(記憶領域から読み込み。現在は一般的にデータベース)
2.ビジネスメソッドを作成
3.ejbStore()をコール(記憶領域に格納。ejbLoadで利用した記憶領域に格納するのが一般的である。)

Q.検索メソッドは何故ejbFindXXX()とつけるんですか?
なんでだろ〜♪

Q.検索メソッド作成時の注意点は?
A.
1.ejbFindByPrimaryKeyを実装
2.検索メソッドの接頭辞はejbFind
3.戻り値は、primaryKey,またはprimaryKeyコレクションにする。

Q.ホームインタフェースはよく聞きますが、ホームメソッドって何ですか?
A.特定のクラスのすべてのエンティティBeanに適用するビジネスロジックを実行するメソッドです。
対照的となるのが、ビジネスメソッドホームメソッドの接頭辞はejbHome

定義一覧
クラスメソッド
リモートインタフェースビジネスメソッド
リモートホームインタフェース生成メソッド(create)
検索メソッド(find)
ホームメソッド(ejbHomeで実装されているメソッド)
Q.コンテナ管理での選択メソッドとは? A.Bean管理時の検索メソッドに似ている。データベース参照をする。 DeploymentDiscripterで選択メソッドのためのEJBQLを定義する。 接頭辞はejbSelect Q.トランザクションとは? A.一業務単位をあらわす。 Q.トランザクションのscopeとは?
トランザクション属性意味
Requiredトランザクション内で管理される。
RequiresNew常に新しいトランザクションを開始する。
MandatoryRequiredに近いが、トランザクションと関連付けられてない場合は、TransactionRequiredException
NotSupportedそのメソッドをトランザクションに入れない。
Supports
Neverトランザクション内でそのメソッドを呼び出すとRemoteException
Q.コンテナ管理によるトランザクションで許可されていないメソッドは? A. 1.java.sql.Connection#commit 2.java.sql.Connection#setAutoCommit 3.java.sql.Connection#rollback 4.javax.ejbl.EJBContext#getUserTransaction 5.javax.transaction.UserTransactionのすべてのメソッド Q.Bean管理によるトランザクションで許可されていないメソッドは? 1.EJBContext#getRollbackOnly 2.EJBContext#setRollbackOnly JTAトランザクションは(J2EEトランザクション)の考え方はsynchronized!