- コンテナ管理によるreleasionの時は、ローカルアクセスを使用しなければならない。
- ObjectList(1)<->Objects(n) のように密接な関係がある場合は、ローカルrアクセスを利用
- J2EEアプリケーションクライアントがエンタープライズBeanにアクセスするときは、リモートアクセスを利用
- コンポーネントを分散したときは、リモートアクセスを利用
- 分からないときはリモートアクセスを選択、パフォーマンスは別として、ローカルアドレスでできることはリモートアドレスでも出来るがその逆は否。
/*
* ユーザを定義したオブジェクト
*/
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に必要なものはなんですか?
- Deployment Discripter
- EnterpriseBean class
- Interface for EnterpriseBean
- 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 | 常に新しいトランザクションを開始する。 |
| Mandatory | Requiredに近いが、トランザクションと関連付けられてない場合は、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!