naobe @ ウィキ
JavaEE5
最終更新:
Bot(ページ名リンク)
-
view
Javaに戻る
機能
- EJB3.0 Enterprize Java Bean
- JPA Java Persistence API
- JMS Java messaging Service
- JAX-WS
- Web Service Metadata for the java platform
- JSF
DIプログラミング
オートワイヤリング
フィールドの型からコンテナがインジェクションするクラスを自動的に決定する仕組み。
<例>
<例>
public class FooBean implements Foo {
// インジェクションポイント(フィールドインジェクション)。
// EJBコンテナによってBarオブジェクトがインジェクションされる。
@[[EJB]]
private Bar bar;
Barはインタフェース。BarをインプリメントしたBarBeanをコンテナが選択してFoBeanにインジェクションする。
Barをインプリメントしたクラスが複数ある場合は、以下のように名前を指定する。クラスに名前が設定されていない場合はクラス名となる。
@EJB(beanName = 'BarBean') private Bar bar;
クラスに名前を指定するには以下のようにする。
@Stateless(name = 'BarBean')
public class BarBean implements Bar {
セッションBeanとトランザクション
アイソレーションレベル
アプリケーションサーバのコネクションプールに対して、設定ファイルまたは管理コンソールから設定する。
EJBとトランザクション
トランザクション管理の実装パターン
EJBコンテナに内蔵されたトランザクションマネジャーを利用する方式、つまりJTAモデルを使うのが一般的。
- JTAによるトランザクション管理
- EJB(BMT)によるトランザクション管理 Beanが管理するトランザクション
- EJB(CMT)によるトランザクション管理 コンテナが管理するトランザクション
- 明示的トランザクション・・トランザクションの開始、コミット、ロールバックをマニュアルで記述(JMS,JDBC, JTA, EJB(BMT)によるトランザクション管理)
- 宣言的トランザクション・・トランザクションの制御はコンテナやフレームワークに任せる。(EJB(CMT)によるトランザクション管理)
EJBのトランザクション管理区分
Beanのクラスにアノテーションを記述してBMTかCMTを設定する。
| 項目 | アノテーション | 備考 |
| BMT | @TransactionManagement(TransactionManagementType.BEAN) | |
| CMT | @TransactionManagement(TransactionManagementType.CONTAINER) | デフォルト |
BMT,CMTが使用できるのは、セッションBeanとメッセージ駆動Bean。
CMTの場合、メソッドが開始する前にトランザクションを開始しメソッドが終了するとコミットする。メソッドが特定の例外を発生するとロールバックする。CMTはトランザクション属性を設定する。
RuntimeExceptionを継承した例外(非チェック例外)が発生した場合はロールバック。Exceptionを継承した例外(チェック例外)が発生した場合はロールバックしない。ただし、ロールバックマークをつけるとチェック例外でもロールバックする。
CMTの場合、メソッドが開始する前にトランザクションを開始しメソッドが終了するとコミットする。メソッドが特定の例外を発生するとロールバックする。CMTはトランザクション属性を設定する。
RuntimeExceptionを継承した例外(非チェック例外)が発生した場合はロールバック。Exceptionを継承した例外(チェック例外)が発生した場合はロールバックしない。ただし、ロールバックマークをつけるとチェック例外でもロールバックする。
【トランザクション属性】
クラス全体にも、メソッドにもアノテーションを設定できる。
クラス全体にも、メソッドにもアノテーションを設定できる。
| 項目 | アノテーション | 説明 | デフォルト |
| Required | @TransactionAttribute(TransactionAttributeType.REQUIRED) | 他のメソッドから呼び出されたときに、他のメソッドのトランザクションを引き継ぐ。 | ○ |
| RequiresNew | @TransactionAttribute(TransactionAttributeType.REQUIRES_NEW) | 他のメソッドから呼び出されたときに他のメソッドのトランザクションを引き継がない。新たにトランザクションを開始する。他のメソッドのトランザクションは中断する。 | |
例外とトランザクション
@ApplicationException(rollback = true)アノテーションをチェック例外クラスに設定すると、ロールバックする。逆に@ApplicationException(rollback = false)アノテーションを非チェック例外クラスに設定すると、ロールバックしないでコミットする。
JPA
JPAの基本
エンティティクラス
クラスに@Entityアノテーションを設定する
クラスに@Tableアノテーションを設定する。name属性にはテーブル名を設定する。
キーとなるフィールドまたはgetメソッドには、@Idアノテーションを設定する
DBのカラムと対応するフィールドまたはgetメソッドには、@Columnアノテーションを設定する。name属性にはカラム名を設定する。
Date型またはCalendar型のフィールドには@Temporalアノテーションを設定する。属性の設定は以下参照。
クラスに@Tableアノテーションを設定する。name属性にはテーブル名を設定する。
キーとなるフィールドまたはgetメソッドには、@Idアノテーションを設定する
DBのカラムと対応するフィールドまたはgetメソッドには、@Columnアノテーションを設定する。name属性にはカラム名を設定する。
Date型またはCalendar型のフィールドには@Temporalアノテーションを設定する。属性の設定は以下参照。
| フィールドの型 | 属性設定 |
| java.sql.Date | TemporalType.DATE |
| java.sql.Time | TemporalType.TIME |
| java.sql.TimeStamp | TemporalType.TIMESTAMP |
【例】
@Entity
@Table(name = "EMPLOYEES")
public class Employees {
@Id
@Column(name = "EMPLOYEE_ID")
public int getEmployeeId() {
return employeeId;
}
@Column(name = "HIRE_DATE")
@Temporal(TemporalType.DATE)
public Date getHireDate() {
return hireDate;
}
persistence.xml
以下の位置に配置
ejb
|
+-- パッケージを表すディレクトリ
| +-- *.class
+--META-INF
+-- MANIFEST.MF
+-- ejb-jar.xml ・・・使用するEJBの参照設定など。
+-- persistence.xml ・・・永続化設定ファイル。JPAで使用。
webapp
|
+--WEB-INF
| |
| +-- web.xml
| +-- classes ・・・[[WEBアプリケーション]]、プロパティファイルを置く
| |
| +-- META-INF
| +-- persistence.xml ・・・永続化設定ファイル。JPAで使用。
| +-- lib ・・・WEBアプリケーション内で共有するjarファイルを置く
+-- *.jsp
エンティティマネジャの呼び出し
【EJB】
セッションビーンでDIを使って取り込む。unitNameは、persistence.xmlで設定した値。
セッションビーンでDIを使って取り込む。unitNameは、persistence.xmlで設定した値。
@Stateless
public class EmployeeTableBean implements EmployeeTable {
@PersistenceContext(unitName = "WasOraclePersistenceUnit")
private EntityManager em;
【EJB以外】
JPAとトランザクション
JTAとリソースローカルトランザクション
JTAは、EJBコンテナが管理するトランザクション。リソースローカルトランザクションは、DB固有のトランザクション。
EJBコンテナ管理(JTA)
EJBを開始して終了するまで、EJBコンテナが管理するトランザクションに参加する。アプリケーションでbegin, commitする必要がない。
プログラムでのロールバックは不要?
プログラムでのロールバックは不要?
JPAとリレーションシップ
カスケード戦略
エンティティクラスのフィールドgetメソッドのアノテーション(ManyToOne, OneToOne, OneToMany, ManyToMany)にcascade属性を追加する。cascade属性は以下のどれか。
cascade属性を設定しないとカスケード操作は行わない。
cascade属性を設定しないとカスケード操作は行わない。
| カスケード属性 | 値 |
| 全て | CascadeType.ALL |
| persist操作のみ | CascadeType.PERSIST |
| remove操作のみ | CascadeType.REMOVE |
| merge操作のみ | CascadeType.MERGE |
| reflesh操作のみ | CascadeType.REFLESH |
OneToOneの時にはALLにして、他のケースではREFLESHにすれば良いのでは?
JPQLとクエリ
Date型の比較
直接Date型のフィールドを比較する
【例】
【例】
Query query =
em.createQuery(
"SELECT e FROM Employee AS e " +
"WHERE e.hireDate >= :startDate AND " +
"e.hireDate <= :endDate")
.setParameter("startDate", startDate)
.setParameter("endDate", endDate);
