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を継承した例外(チェック例外)が発生した場合はロールバックしない。ただし、ロールバックマークをつけるとチェック例外でもロールバックする。

【トランザクション属性】
クラス全体にも、メソッドにもアノテーションを設定できる。
項目 アノテーション 説明 デフォルト
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アノテーションを設定する。属性の設定は以下参照。
フィールドの型 属性設定
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で設定した値。

 @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属性を設定しないとカスケード操作は行わない。

カスケード属性
全て 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);

JPAにおける委譲と継承

JPAの様々な機能

ウィキ募集バナー