ヘッダーをスキップ
Oracle® Fusion Middleware Oracle Coherenceチュートリアル
12c (12.1.2)
B70747-02
  ドキュメント・ライブラリへ移動
ライブラリ
製品リストへ移動
製品
目次へ移動
目次

前
 
次
 

8 JPAとCoherenceの併用

この演習では、Java Persistence API (JPA)を使用してオブジェクト・リレーショナル・マッピングを実行する方法を学習します。ここでは、Coherenceのメモリーベースのバッキング・マップとOracle TopLink Gridの使用について取り上げます。

この章には次の項が含まれます:

実用バージョンのOracle Database Express Edition (OracleXE データベース)がシステムにインストールされている必要があります。このデータベースがない場合には、次のURLからダウンロードできます。

http://www.oracle.com/technetwork/database/database-technologies/express-edition/downloads/index.html

8.1 概要

JPAでは、リレーショナル・データをJavaオブジェクト(永続性エンティティ)にマップする方法や、これらのオブジェクトをリレーショナル・データベースに格納して後でアクセスできるようにする方法のほか、エンティティを使用するアプリケーションが終了してもそのエンティティの状態を存続させる方法を定義します。エンティティ永続性モデルを簡略化する以外に、JPAはオブジェクト・リレーショナル・マッピングを標準化します。

Coherenceクラスタ内にデータを格納する方法を決定するには、バッキング・マップを使用します。デフォルトでは、Coherenceではメモリーベースのバッキング・マップが使用されます。データを永続化するために実装されるバッキング・マップには、複数のものがあります。

この演習で使用するJPA実装には、Java環境からデータベース環境へのオブジェクト・リレーショナル・マッピング(ORM)が用意されています。そのため、標準的なCoherenceのgetメソッドやputメソッドを使用したり、JPAおよび(オープン・ソースのEclipseLinkプロジェクトに基づき)Oracle TopLinkを使用してCoherenceコールをデータベース・コールに変換したりすることもできます。

Oracle TopLinkとは

Oracle TopLinkは、Java SEおよびJava EE環境で変換、マッピング、永続性操作を提供するための開発ツールと実行時機能を含む永続性フレームワークです。TopLinkのコア・テクノロジは、Eclipse Foundationのオープンソースの永続性フレームワークであるEclipseLinkによって提供されます。

TopLinkには、EclipseLinkにはない追加機能が含まれています。TopLinkで提供される追加コンポーネントの1つはTopLink Gridです。

Oracle TopLink Gridとは

Oracle TopLink Gridは、EclipseLinkによって提供されるTopLink JPA実装とOracle Coherenceとを統合するために使用される機能です。

Coherence APIをTopLink Gridによって支援されたキャッシュとともに使用して、JPAに対して実装された特殊なキャッシュ・ローダーおよびキャッシュ・ストア・インタフェースでリレーショナル・データにアクセスできます。この従来のCoherenceアプローチでは、TopLink GridはEclipseLink JPA用に最適化されたoracle.eclipselink.coherence.standaloneパッケージにCacheLoaderおよびCacheStore実装を提供します。

JPAを使用してアプリケーションを構築し、データ・グリッドの機能を透過的に使用してスケーラビリティとパフォーマンスを向上させることができます。TopLink Gridは、Oracle Coherenceを使用してJPAアプリケーションをスケーリングするための手段を提供します。アプリケーションは、Coherenceを分散共有(L2)キャッシュとして使用することから、JP QL問合せをCoherenceに送ってグリッド全体でパラレル実行してデータベース負荷を削減することまで、様々な方法でスケーリングできます。このようなグリッド基盤のJPAアプローチにおいては、TopLink Gridが、キャッシュのセットと、EclipseLink JPAでのCoherenceの使用方法を制御できる問合せ構成オプションを提供します。これらの実装は、oracle.eclipselink.coherence.integratedパッケージ内にあります。

TopLink Gridのキャッシュ・ストア実装およびキャッシュ・ローダー実装は、toplink-grid.jarファイルに含まれています。TopLink Gridは、標準のJPAランタイム構成ファイルpersistence.xmlとJPAマッピング・ファイルorm.xmlを使用します。Coherenceのキャッシュ構成ファイルcoherence-cache-config.xmlを、デフォルトのCoherence設定をオーバーライドし、キャッシュ・ストア・キャッシング・スキームを定義するように指定する必要があります。

このプロジェクトでは、EclipseLink JPAにあわせて最適化され、Coherenceアプリケーションで使用できるように設計されているTopLink Gridのキャッシュ・ストア・クラスとキャッシュ・ローダー・クラスが使用されます。これらのクラスはoracle.eclispelink.coherence.standaloneパッケージにあります。詳細は、『Oracle Fusion Middleware Oracle Coherenceの統合』のTopLink Gridによって支援されたCoherenceキャッシュの使用に関する項を参照してください。

グリッド基盤のJPAのアプローチは、このプロジェクトでは説明しません。この技術の詳細は、『Oracle Fusion Middleware Oracle Coherenceの統合』のTopLink GridとOracle Coherenceの統合に関する項を参照してください。

8.2 JPAを使用したJavaオブジェクトへのリレーショナル・データのマッピング

この演習では、Eclipseを使用して次のタスクを実行します。

  1. OracleXEデータベースのロック解除

  2. JPAに対するプロジェクトの構成

  3. JPA永続ユニットとエンティティの作成

  4. persistance.xmlファイルの編集

  5. JPAに対するキャッシュ構成ファイルの作成

  6. キャッシュ・サーバーの起動構成ファイルの作成

  7. データ・オブジェクトとやり取りするクラスの作成

  8. RunEmployeeExampleの実行構成の作成

  9. JPAサンプルの実行

8.2.1 OracleXEデータベースのロック解除

インストール済のOracleXEデータベースでHRアカウントのロックを解除します。

使用するシステムにOracleXEデータベースをインストールし、HRスキーマにアクセスできるようにしておく必要があります。HRアカウントのロックを解除するには:

  1. 「Start」「All Programs」「Oracle Database 11g Express Edition」「Run SQL Command Line」の順に移動します。

  2. connect system as sysdbaと入力し、パスワードを要求されたらwelcome1と入力します(注意: ユーザー名はsystem、パスワードはwelcome1です。)

  3. 次のコマンドを入力してアカウントのロックを解除します。

    alter user hr identified by hr account unlock;
    

これらのコマンドは図8-1に示されています。

図8-1 データベースへの接続

データベースへの接続
「図8-1 データベースへの接続」の説明

8.2.2 JPAに対するプロジェクトの構成

Eclipse IDE内にJPAProjectという新規プロジェクトを作成します。詳細は、「Eclipse IDEでの新規プロジェクトの作成」を参照してください。

  1. Eclipse IDEで、「Window」「Open Perspective」「Other」をクリックし、「Open Perspective」ダイアログ・ボックスを開きます。図8-2に示されているように、「JPA」パースペクティブを選択します。

    図8-2 「Open Perspective」ダイアログ・ボックス内でのJPAパースペクティブの選択

    「Open Perspective」ダイアログ・ボックス内のJPAパースペクティブ
    「図8-2 「Open Perspective」ダイアログ・ボックス内でのJPAパースペクティブの選択」の説明

  2. 「File」「New」「JPA Project」を選択します。プロジェクト名にJPAProjectと入力します。デフォルトの場所がhome\oracle\workspace\JPAProjectをポイントしていることを確認します。「Configuration」フィールドで「Modify」をクリックし、「Project Facets」ダイアログ・ボックスを開きます。

  3. 「Oracle Coherence」ファセットを選択します。JPAJavaファセットがすでに選択されていることを確認します。

  4. 「Configuration」フィールドで「Save As」をクリックします。「Save Preset」ダイアログ・ボックスでJPAConfigurationと入力し、「OK」をクリックします。「Project Facets」ダイアログ・ボックスの内容は図8-3のようになります。

    図8-3 JPAプロジェクトのプロジェクト・ファセット

    JPAプロジェクトのプロジェクト・ファセット
    「図8-3 JPAプロジェクトのプロジェクト・ファセット」の説明

    「New JPA Project」ダイアログ・ボックスの内容は、図8-4のようになります。「Next」をクリックして「Java」ページへ移動します。

    図8-4 「New JPA Project」ダイアログ・ボックスの内容

    「JPA Projects」ダイアログ・ボックスの内容
    「図8-4 「New JPA Project」ダイアログ・ボックスの内容」の説明

  5. 「Java」ページで「Next」をクリックして、デフォルトの出力先フォルダの場所を受け入れます。

  6. 「JPA Facet」ページの「Platform」ドロップダウン・リストで「EclipseLink 2.4.x」を選択します。「Manage Libraries」アイコンをクリックして、TopLink Grid、EclipseLinkおよびJava Persistenceのファイルを追加します。

  7. 「Preferences」ダイアログ・ボックスで「New」をクリックします。「New User Library」ダイアログ・ボックスで、TopLinkと入力します。図8-5に示すように、「System library」チェック・ボックスを選択します。

    図8-5 EclipseLink JPAライブラリの追加

    EclipseLink JPAライブラリのダウンロード
    「図8-5 EclipseLink JPAライブラリの追加」の説明

  8. 「OK」をクリックして「New User Library」ダイアログ・ボックスを閉じます。

  9. 「Preference」ダイアログ・ボックスで、「TopLink[system library]」を選択し、「Add External JARS」をクリックします。

  10. Oracle_Home\oracle_common\modules\oracle.toplink_12.1.2フォルダに移動します。toplink-grid.jarおよびeclipselink.jarファイルを選択し、「Open」をクリックします。toplink-grid.jarおよびeclipselink.jarファイルが「TopLink」ライブラリに追加されます。「Add External JARS」を再度クリックし、Oracle_Home\oracle_common\modulesフォルダに移動します。javax.persistence_2.0.0.0_2-0.jarファイルを選択し、「Open」をクリックします。終了すると、「User Libraries」は図8-6のようになります。

    図8-6 TopLinkユーザー・ライブラリへのToplink Grid、EclipselinkおよびJava PersistenceのJARファイルの追加

    EclipseLinkユーザー・ライブラリへのeclipselink.jarの追加
    「図8-6 TopLinkユーザー・ライブラリへのToplink Grid、EclipselinkおよびJava PersistenceのJARファイルの追加」の説明

  11. 「OK」をクリックして「Preferences」ダイアログ・ボックスを閉じます。「TopLink」ユーザー・ライブラリを選択します。「JPA Facet」ページが図8-7のように表示されます。

    図8-7 「JPA Facet」ページへのTopLinkライブラリの追加

    「JPA Facet」ページに追加されたEclipseLinkライブラリ
    「図8-7 「JPA Facet」ページへのTopLinkライブラリの追加」の説明

  12. Oracle XEデータベースへの接続を作成します。「Add connection」をクリックします。

    1. 「Connection Profile」ダイアログ・ボックスで、図8-8に示されるように「Oracle Database Connection」を選択して、「Name」フィールドにXE_HRと入力します。「Next」をクリックします。

      図8-8 「Connection Profile」ページ

      「Connection Profile」ページ
      「図8-8 「Connection Profile」ページ」の説明

    2. 「Drivers」フィールドで「Oracle Database 11g Driver Default」を選択します。「General」タブを編集します。「User name」フィールドにhr「Password」フィールドにhrと入力します。「Save Password」チェック・ボックスを選択します。「Host」フィールドにlocalhostと入力します。「Connect when the wizard completes」チェック・ボックスを選択します。「Test Connection」ボタンをクリックします。テストで、図8-9に示されているような成功メッセージが表示された警告ボックスが返されます。「OK」「Next」をクリックすると、「Summary」ページが表示されます。「Finish」をクリックします。

      図8-9 「New Connection Profile」ダイアログ・ボックスおよび成功メッセージ

      「New Connection Profile」ダイアログ・ボックスおよび成功メッセージ
      「図8-9 「New Connection Profile」ダイアログ・ボックスおよび成功メッセージ」の説明

    3. 「JPA Facet」ページで、「Add driver library to build path」「Next」をクリックします。

  13. 「Coherence」ページで、「Coherence 12.1.2」および「TopLink」ユーザー・ライブラリが存在し、選択されていることを確認します。「Finish」をクリックします。

    図8-10 新規JPAプロジェクト・ウィザードの「Coherence」ページ

    新規JPAプロジェクト・ウィザードの「Coherence」ページ
    「図8-10 新規JPAプロジェクト・ウィザードの「Coherence」ページ」の説明

8.2.3 JPA永続性ユニットおよびエンティティの作成

永続性ユニットには、メタデータ・ファイル、クラス、およびグループとしての永続に必要なすべてのクラスを含むJARのセットを識別する簡単な方法が備わっています。永続性ユニットは、その名前によって識別されます。エンティティは永続データを含み、永続データ・ストアに保存できます。JPAエンティティは、永続性ユニットに属することができます。永続性ユニットは、persistence.xmlファイルにより記述されています。

JPA永続性ユニットとJPAエンティティを作成するには:

  1. JPAProjectプロジェクトを右クリックして、「New」「JPA Entities from Tables」を選択します。「Select Tables」ダイアログ・ボックスが開きます。

  2. 図8-11に示されているようにEMPLOYEES表を選択し、「Next」をクリックします。

    図8-11 データベース表の選択

    データベース表の選択
    「図8-11 データベース表の選択」の説明

  3. Table Associations」ページで、図8-12に示されているように、「Next」をクリックしてデフォルト設定を受け入れます。

    図8-12 EMPLOYEES表に対するアソシエーション

    EMPLOYEES表に対するアソシエーション
    「図8-12 EMPLOYEES表に対するアソシエーション」の説明

  4. 「Customize Defaults」ページで、「Collection properties type」java.util.Listを選択し、「Package」フィールドにcom.oracle.handsonと入力します。「Associations fetch」フィールドで、「Lazy」を選択します。

    終了すると、「Customize Default Entity Generation」ページは図8-13のようになります。「Next」をクリックします。

    図8-13 「Customize Default Entity Generation」ページ

    デフォルトのエンティティ生成のカスタマイズ
    「図8-13 「Customize Default Entity Generation」ページ」の説明

  5. 「Customize Individual Entities」ページで、「Superclass」フィールドにjava.lang.Objectと入力します。図8-14に示すとおり、「Class name」EmployeeからEmployeesに変更します。

    図8-14 「Customize Individual Entities」ページ

    「Customize Individual Entities」ダイアログ・ボックス
    「図8-14 「Customize Individual Entities」ページ」の説明

  6. 「Finish」をクリックしてJPAエンティティを生成します。「Project Explorer」のJPAProject/src/com.oracle.handsonノードにEmployees.javaファイルが生成されます。

8.2.4 persistance.xmlファイルの編集

persistence.xmlファイルは1つまたは複数の永続性ユニットを定義します。Eclipse IDEでpersistence.xml Editorツールを使用して、persistence.xmlファイルを編集します。

  1. Eclipseエディタでpersistence.xmlファイルを開きます。

  2. 「一般」タブをクリックします。まだ指定していない場合は、永続性プロバイダの名前を入力します。org.eclipse.persistence.jpa.PersistenceProviderと入力ます。

    図8-15 persistence.xmlエディタの「General」タブ

    persistence.xmlエディタの「General」タブ
    「図8-15 persistence.xmlエディタの「General」タブ」の説明

  3. 「Connection」タブで、「Transaction type」ドロップダウン・リストから「Resource Local」を選択します。

    「EclipseLink connection pool」セクションで、「Populate from connection」リンクをクリックしてから、「Connection Selection」ダイアログ・ボックスのXE_HR項目をクリックします。このフィールドの値は、「JPAに対するプロジェクトの構成」で定義したデータベース接続に基づいて設定されます。「Connection Properties」タブは、図8-16のようになります。

    図8-16 persistence.xmlエディタの「Connection Properties」タブ

    「Connection Properties」タブ
    「図8-16 persistence.xmlエディタの「Connection Properties」タブ」の説明

  4. 「Logging」タブを開き、「Logging level」ドロップダウン・リストから「Fine」を選択します。

    「Exceptions」チェック・ボックスを選択します。「Timestamp」「Thread」「Session」および「Connection」チェック・ボックスの選択を解除します。終了すると、「Logging」タブは次のようになります。

    図8-17 persistence.xmlエディタの「Logging」タブ

    persistence.xmlエディタの「Logging」タブ
    「図8-17 persistence.xmlエディタの「Logging」タブ」の説明

  5. 「Properties」タブを調べます。内容は図8-18のようになります。

    図8-18 persistence.xmlエディタの「Properties」タブ

    persistence.xmlエディタの「Properties」タブ
    「図8-18 persistence.xmlエディタの「Properties」タブ」の説明

  6. 「Source」タブを開きます。persistence.xmlファイルは例8-1のようになります。ファイルを保存します。

    例8-1 生成されたpersistence.xmlファイル

    <?xml version="1.0" encoding="UTF-8"?>
    <persistence version="2.0" xmlns="http://java.sun.com/xml/ns/persistence" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_2_0.xsd">
      <persistence-unit name="JPAProject" transaction-type="RESOURCE_LOCAL">
        <provider>org.eclipse.persistence.jpa.PersistenceProvider</provider>
        <class>com.oracle.handson.Employees</class>
        <properties>
          <property name="eclipselink.target-server" value="None"/>
          <property name="javax.persistence.jdbc.url" value="jdbc:oracle:thin:@localhost:1521:xe"/>
          <property name="javax.persistence.jdbc.user" value="hr"/>
          <property name="javax.persistence.jdbc.password" value="hr"/>
          <property name="javax.persistence.jdbc.driver" value="oracle.jdbc.OracleDriver"/>
          <property name="eclipselink.logging.level" value="FINE"/>
          <property name="eclipselink.logging.timestamp" value="false"/>
          <property name="eclipselink.logging.thread" value="false"/>
          <property name="eclipselink.logging.session" value="false"/>
          <property name="eclipselink.logging.connection" value="false"/>
          <property name="eclipselink.logging.exceptions" value="true"/>
        </properties>
      </persistence-unit>
    </persistence>
    

8.2.5 JPAに対するキャッシュ構成ファイルの作成

JPAプロジェクトに対するキャッシュ構成ファイルを作成します。

  1. プロジェクト内のcoherence-cache-config.xmlファイルを右クリックし、「Open」を選択します。

  2. 例8-2のようにコードを入力します。「Rename」または「Save As」を使用して、ファイルをjpa-cache-config.xmlとして保存します。ファイルはhome\oracle\workspace\JPAProject\srcフォルダに保存されます。

  3. 「Project Explorer」に元のcoherence-cache-config.xmlファイルが表示されていないことを確認します。

    例8-2で、scheme-name要素の値としてdistributed-eclipselinkservice-name要素の値としてEclipseLinkJPA、およびcachestore-scheme要素のclass-nameサブ要素の値としてoracle.eclipselink.coherence.standalone.EclipseLinkJPACacheStoreが使用されていることに注意してください。

    例8-2 JPAに対するキャッシュ構成

    <?xml version="1.0"?>
     
    <cache-config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
                  xmlns="http://xmlns.oracle.com/coherence/coherence-cache-config"
                  xsi:schemaLocation="http://xmlns.oracle.com/coherence/coherence-cache-config http://xmlns.oracle.com/coherence/coherence-cache-config/1.2/coherence-cache-config.xsd">
     
      <defaults>
        <serializer system-property="tangosol.coherence.serializer"/>
        <socket-provider system-property="tangosol.coherence.socketprovider"/>
      </defaults>
      <caching-scheme-mapping>
        <cache-mapping>
          <!-- Set the name of the cache to be the entity name  -->
          <cache-name>Employees</cache-name>
          <!-- Configure this cache to use the scheme defined below  -->
          <scheme-name>distributed-eclipselink</scheme-name>
        </cache-mapping>
      </caching-scheme-mapping>
      <caching-schemes>
        <distributed-scheme>
          <scheme-name>distributed-eclipselink</scheme-name>
          <service-name>EclipseLinkJPA</service-name>
          <backing-map-scheme>
            <read-write-backing-map-scheme>
              <!--
          Define the cache scheme
          -->
              <internal-cache-scheme>
                <local-scheme/>
              </internal-cache-scheme>
              <cachestore-scheme>
                <class-scheme>
                  <class-name>oracle.eclipselink.coherence.standalone.EclipseLinkJPACacheStore</class-name>
                  <init-params>
                    <!--
                This param is the entity name
                This param should match the value of the
                persistence unit name in persistence.xml
                -->
                    <init-param>
                      <param-type>java.lang.String</param-type>
                      <param-value>{cache-name}</param-value>
                    </init-param>
                    <init-param>
                      <param-type>java.lang.String</param-type>
                      <param-value>JPAProject</param-value>
                    </init-param>
                  </init-params>
                </class-scheme>
              </cachestore-scheme>
            </read-write-backing-map-scheme>
          </backing-map-scheme>
          <autostart>true</autostart>
        </distributed-scheme>
      </caching-schemes>
    </cache-config>
    

8.2.6 キャッシュ・サーバー起動の構成の作成

JPAプロジェクト用キャッシュ・サーバーを起動するための構成を作成します。

  1. プロジェクトを右クリックして、「Run As」「Run Configurations」を選択します。「Run Configurations」ダイアログ・ボックスで「Oracle Coherence」アイコンをダブルクリックして、新しい起動構成を作成します。

  2. 「Main」タブで、「Name」フィールドにJPAServerと入力します。「Project」フィールドの「Browse」をクリックし、「Project Selection」ダイアログ・ボックスでJPAProjectプロジェクトを選択します。「Include system libraries when searching for a main class」チェック・ボックスを選択し、「Search」をクリックします。「Select Type」フィールドにDefaultCacheServerと入力して、com.tangosol.net.DefaultCacheServerを選択します。「Apply」をクリックします。「Main」タブは図8-19のようになります。

    図8-19 JPAキャッシュ・サーバー用「Main」タブ

    JPAキャッシュ・サーバー用「Main」タブ
    「図8-19 JPAキャッシュ・サーバー用「Main」タブ」の説明

  3. 「Coherence」タブの「General」タブで、「Cache configuration descriptor」の下にあるキャッシュ構成ファイルへのパスを指定します。「Browse」ボタンをクリックして、JPAキャッシュ構成ファイルの絶対ファイル・パスC:\home\oracle\workspace\JPAProject\src\jpa-cache-config.xmlに移動します。「Local storage」の下の「Enabled (cache server)」を選択します。「Cluster port」には3155などの一意の値を入力します。

    「Other」タブで、tangosol.pof.configの項目がデフォルトのpof-config.xmlに設定されていることを確認します。

  4. 「Common」タブで、「Shared file」を選択して\JPAプロジェクトを参照します。

  5. 「Classpath」タブは図8-20のようになります。

    図8-20 JPAキャッシュ・サーバー実行可能ファイルの「Classpath」タブ

    JPAキャッシュ・サーバーの「Classpath」タブ
    「図8-20 JPAキャッシュ・サーバー実行可能ファイルの「Classpath」タブ」の説明

キャッシュ・サーバーの起動は、後の手順「JPAサンプルの実行」で実行します。

8.2.7 データ・オブジェクトとやり取りするためのクラスの作成

JPAProjectプロジェクト内にEmployeesオブジェクトとやり取りするための新規クラスを作成します。このクラスは、従業員のサラリーの値を変更する目的で作成されます。

  1. RunEmployeeExampleというmainメソッドを持つ新規クラスを作成します。詳細は、「Javaクラスの作成」を参照してください。

  2. 次のタスクを実行するコードを作成します。

    1. EMPLOYEE_ID属性を使用して従業員を取得します。EMPLOYEE_IDlongデータ・タイプです。

    2. サラリーを表示します。

    3. 従業員の昇給を10%にします。

    4. 値を再度取得して、昇給を確定します。

    例8-3は、考えられるRunEmployeeExampleクラスの実装を示しています。

    例8-3 従業員クラスのサンプル・ファイル

    package com.oracle.handson;
    
    import com.tangosol.net.CacheFactory;
    import com.tangosol.net.NamedCache;
    import java.math.BigDecimal;
    
    public class RunEmployeeExample 
        {
        public RunEmployeeExample() 
        {
        }
    
        public static void main(String[] args) 
            {
            long empId = 190L;  // emp 190 - Timothy Gates
            
            NamedCache employees = CacheFactory.getCache("Employees");
            
            Employees emp = (Employees)employees.get(empId);   
            
            System.out.println("Employee " + emp.getFirstName() + " " + 
                            emp.getLastName() + ", salary = $" + emp.getSalary() );
            
            // give them a 10% pay rise
            emp.setSalary(emp.getSalary().multiply(BigDecimal.valueOf(1.1)));
            
            employees.put(empId, emp);
            
            Employees emp2 = (Employees)employees.get(empId);
            
            System.out.println("New Employee details are " + emp2.getFirstName() + " " + emp2.getLastName() + ", salary = $" + emp2.getSalary() );
           }
    }
    

8.2.8 RunEmployeeExampleの実行構成の作成

実行構成を作成するには、実行時のプロパティを変更してEclipseのクラス・パスを編集します。

  1. 「Project Explorer」RunEmployeeExample.javaを右クリックし、「Run As」「Run Configurations」を選択します。「Run Configurations」ダイアログ・ボックスで、「Oracle Coherence」アイコンをダブルクリックして、新しい起動構成を作成します。

  2. 「Main」タブで、「Name」フィールドにRunEmployeeと入力します。「Browse」をクリックし、JPAProjectプロジェクトを選択します。「Main class」フィールドで、「Search」をクリックしてcom.oracle.handson.RunEmployeeExampleを選択します。「Apply」をクリックします。

  3. 「Coherence」タブの「General」タブで、「Cache configuration descriptor」フィールドのC:\home\oracle\workspace\JPAProject\src\jpa-cache-config.xmlファイルを参照します。「Disabled (cache client)」ボタンを選択します。「Cluster port」フィールドに3155と入力します。「Apply」をクリックします。

  4. 「Other」タブで、デフォルトのpof-config.xmltangosol.pof.configフィールドに表示されていることを確認します。

  5. 「Common」タブで、「Shared file」を選択して\JPAProjectプロジェクトを参照します。

    「Classpath」タブは図8-21のようになります。

    図8-21 RunEmployee実行可能ファイルの「Classpath」タブ

    RunEmployeeExampleプログラムの「Classpath」タブ
    「図8-21 RunEmployee実行可能ファイルの「Classpath」タブ」の説明

8.2.9 JPAサンプルの実行

Employeeクラスに対してJPAを使用してデータベースに永続化するように注釈を付け、データベースの場所をJPAに知らせるpersistence.xmlファイルを追加したため、CoherenceではCacheStore実装が採用され、TopLink Gridを使用してオブジェクトがデータベースにロードおよび格納されます。get(Object key)メソッドを使用すると、次のことが実行されます。

  • Coherenceで、キーを持つエントリが検索されます。

  • エントリがまだキャッシュされていない場合や、期限切れでキャッシュから削除されている場合には、バッキング・マップがコールされ、TopLink Gridキャッシュ・ストアを使用してデータが取得されます。

  • エントリがキャッシュされている場合は、TopLink Gridキャッシュ・ストアを介さずにそのエントリがアプリケーションに直接返されます。put(object key,object value)メソッドを使用する場合は、データベースに変更を永続化するために、TopLink Gridを介してEclipseLink JPAが使用されます。

「Run Configurations」ダイアログ・ボックスで、JPAServer起動構成を選択し、「Run」をクリックしてキャッシュ・サーバーを起動します。キャッシュ・サーバーの起動後、RunEmployee構成を選択し、「Run」をクリックします。実行可能ファイルからの出力は例8-4のようになります。

例8-4 実行可能ファイルからの出力

...
Group{Address=224.12.1.0, Port=3155, TTL=4}
 
MasterMemberSet(
  ThisMember=Member(Id=2, Timestamp=2013-02-22 13:59:12.203, Address=192.168.0.102:8090, MachineId=18578, Location=site:,machine:tpfaeffl-lap7,process:5436, Role=OracleHandsonRunEmployeeExample)
  OldestMember=Member(Id=1, Timestamp=2013-02-22 13:58:41.89, Address=192.168.0.102:8088, MachineId=18578, Location=site:,machine:tpfaeffl-lap7,process:4152, Role=CoherenceServer)
  ActualMemberSet=MemberSet(Size=2
    Member(Id=1, Timestamp=2013-02-22 13:58:41.89, Address=192.168.0.102:8088, MachineId=18578, Location=site:,machine:tpfaeffl-lap7,process:4152, Role=CoherenceServer)
    Member(Id=2, Timestamp=2013-02-22 13:59:12.203, Address=192.168.0.102:8090, MachineId=18578, Location=site:,machine:tpfaeffl-lap7,process:5436, Role=OracleHandsonRunEmployeeExample)
    )
  MemberId|ServiceVersion|ServiceJoined|MemberState
    1|12.1.2|2013-02-22 13:58:41.89|JOINED,
    2|12.1.2|2013-02-22 13:59:12.203|JOINED
  RecycleMillis=1200000
  RecycleSet=MemberSet(Size=0
    )
  )
 
TcpRing{Connections=[1]}
IpMonitor{Addresses=0}
 
2013-02-22 13:59:12.625/1.860 Oracle Coherence GE 12.1.2.0.0 <D5> (thread=Invocation:Management, member=2): Service Management joined the cluster with senior service member 1
2013-02-22 13:59:12.656/1.891 Oracle Coherence GE 12.1.2.0.0 <Info> (thread=main, member=2): Loaded Reporter configuration from "jar:file:/C:/Oracle7/coherence/lib/coherence.jar!/reports/report-group.xml"
2013-02-22 13:59:12.843/2.078 Oracle Coherence GE 12.1.2.0.0 <D5> (thread=DistributedCache:EclipseLinkJPA, member=2): Service EclipseLinkJPA joined the cluster with senior service member 1
Employee Timothy Gates, salary = $4245.89
New Employee details are Timothy Gates, salary = $4670.47

キャッシュ・サーバーからの応答によりログインの成功が表示され、例8-5に示すようにデータベースからの情報が取得されます。返されるロギング情報(太字)に注意してください。

例8-5 データベースへのログインに対するキャッシュ・サーバーの応答

... 
Started DefaultCacheServer...
 
2013-02-22 13:59:12.390/31.953 Oracle Coherence GE 12.1.2.0.0 <D5> (thread=Cluster, member=1): Member(Id=2, Timestamp=2013-02-22 13:59:12.203, Address=192.168.0.102:8090, MachineId=18578, Location=site:,machine:tpfaeffl-lap7,process:5436, Role=OracleHandsonRunEmployeeExample) joined Cluster with senior member 1
2013-02-22 13:59:12.640/32.203 Oracle Coherence GE 12.1.2.0.0 <D5> (thread=Invocation:Management, member=1): Member 2 joined Service Management with senior member 1
2013-02-22 13:59:12.875/32.438 Oracle Coherence GE 12.1.2.0.0 <D5> (thread=DistributedCache:EclipseLinkJPA, member=1): Member 2 joined Service EclipseLinkJPA with senior member 1
[EL Config]: metadata: The access type for the persistent class [class com.oracle.handson.Employees] is set to [FIELD].
[EL Config]: metadata: The target entity (reference) class for the many to one mapping element [field employee] is being defaulted to: class com.oracle.handson.Employees.
[EL Config]: metadata: The target entity (reference) class for the one to many mapping element [field employees] is being defaulted to: class com.oracle.handson.Employees.
[EL Config]: metadata: The alias name for the entity class [class com.oracle.handson.Employees] is being defaulted to: Employees.
[EL Config]: metadata: The table name for entity [class com.oracle.handson.Employees] is being defaulted to: EMPLOYEES.
[EL Config]: metadata: The column name for element [email] is being defaulted to: EMAIL.
[EL Config]: metadata: The column name for element [salary] is being defaulted to: SALARY.
[EL Config]: metadata: The primary key column name for the mapping element [field employee] is being defaulted to: EMPLOYEE_ID.
[EL Info]: EclipseLink, version: Eclipse Persistence Services - 2.4.2.v20130131-a7b9798
[EL Fine]: connection: Detected database platform: org.eclipse.persistence.platform.database.oracle.Oracle11Platform
[EL Config]: connection: connecting(DatabaseLogin(
   platform=>OraclePlatform
   user name=> "hr"
   datasource URL=> "jdbc:oracle:thin:@localhost:1521:xe"
))
[EL Config]: connection: Connected: jdbc:oracle:thin:@localhost:1521:xe
   User: HR
   Database: Oracle  Version: Oracle Database 11g Express Edition Release 11.2.0.2.0 - Production
   Driver: Oracle JDBC driver  Version: 11.1.0.7.0-Production
[EL Warning]: metadata: Reverting the lazy setting on the OneToOne or ManyToOne attribute [employee] for the entity class [class com.oracle.handson.Employees] since weaving was not enabled or did not occur.
[EL Info]: connection: file:/C:/home/oracle/workspaceNov/JPAProject/build/classes/_JPAProject login successful
[EL Fine]: sql: SELECT EMPLOYEE_ID, COMMISSION_PCT, DEPARTMENT_ID, EMAIL, FIRST_NAME, HIRE_DATE, JOB_ID, LAST_NAME, PHONE_NUMBER, SALARY, MANAGER_ID FROM EMPLOYEES WHERE (EMPLOYEE_ID = ?)
   bind => [190]
[EL Fine]: sql: SELECT EMPLOYEE_ID, COMMISSION_PCT, DEPARTMENT_ID, EMAIL, FIRST_NAME, HIRE_DATE, JOB_ID, LAST_NAME, PHONE_NUMBER, SALARY, MANAGER_ID FROM EMPLOYEES WHERE (EMPLOYEE_ID = ?)
   bind => [122]
[EL Fine]: sql: SELECT EMPLOYEE_ID, COMMISSION_PCT, DEPARTMENT_ID, EMAIL, FIRST_NAME, HIRE_DATE, JOB_ID, LAST_NAME, PHONE_NUMBER, SALARY, MANAGER_ID FROM EMPLOYEES WHERE (EMPLOYEE_ID = ?)
   bind => [100]
[EL Fine]: sql: SELECT EMPLOYEE_ID, COMMISSION_PCT, DEPARTMENT_ID, EMAIL, FIRST_NAME, HIRE_DATE, JOB_ID, LAST_NAME, PHONE_NUMBER, SALARY, MANAGER_ID FROM EMPLOYEES WHERE (EMPLOYEE_ID = ?)
   bind => [190]
[EL Fine]: sql: SELECT EMPLOYEE_ID, COMMISSION_PCT, DEPARTMENT_ID, EMAIL, FIRST_NAME, HIRE_DATE, JOB_ID, LAST_NAME, PHONE_NUMBER, SALARY, MANAGER_ID FROM EMPLOYEES WHERE (EMPLOYEE_ID = ?)
   bind => [122]
[EL Fine]: sql: SELECT EMPLOYEE_ID, COMMISSION_PCT, DEPARTMENT_ID, EMAIL, FIRST_NAME, HIRE_DATE, JOB_ID, LAST_NAME, PHONE_NUMBER, SALARY, MANAGER_ID FROM EMPLOYEES WHERE (EMPLOYEE_ID = ?)
   bind => [100]
[EL Fine]: sql: UPDATE EMPLOYEES SET SALARY = ? WHERE (EMPLOYEE_ID = ?)
   bind => [4670.47, 190]
2013-02-22 13:59:20.875/40.438 Oracle Coherence GE 12.1.2.0.0 <D5> (thread=Cluster, member=1): TcpRing disconnected from Member(Id=2, Timestamp=2013-02-22 13:59:12.203, Address=192.168.0.102:8090, MachineId=18578, Location=site:,machine:tpfaeffl-lap7,process:5436, Role=OracleHandsonRunEmployeeExample) due to a peer departure; removing the member.
2013-02-22 13:59:20.875/40.438 Oracle Coherence GE 12.1.2.0.0 <D5> (thread=Cluster, member=1): Member(Id=2, Timestamp=2013-02-22 13:59:20.875, Address=192.168.0.102:8090, MachineId=18578, Location=site:,machine:tpfaeffl-lap7,process:5436, Role=OracleHandsonRunEmployeeExample) left Cluster with senior member 1
2013-02-22 13:59:20.875/40.438 Oracle Coherence GE 12.1.2.0.0 <D5> (thread=DistributedCache:EclipseLinkJPA, member=1): Member 2 left service EclipseLinkJPA with senior member 1
2013-02-22 13:59:20.875/40.438 Oracle Coherence GE 12.1.2.0.0 <D5> (thread=Invocation:Management, member=1): Member 2 left service Management with senior member 1