手順 2. O/R マッピングを生成し、EJBQL でテストする

この手順の実施にかかる時間 : 15 分

Workshop は、BEA Kodo JPA のような一般的な永続性サービスを利用するための、多彩で柔軟性のあるオブジェクト リレーショナル マッピング インタフェースを備えています。O/R マッピングは、開発手法に応じて以下の異なるメカニズムで生成できます。

  • スキーマをリバース エンジニアリングしてオブジェクト リレーショナル マッピングを作成する
  • オブジェクト モデルからマッピングを生成する
  • この手順のタスクは以下のとおりです。

     

    [JPA ORM 生成] ウィザードを使用して、アノテーション付きの POJO をスキーマから生成するには

    この手順では、Workshop を使用してスキーマをリバース エンジニアリングする方法で、既存のデータベース スキーマから JPA エンティティ Bean を自動的に生成します。これにより、適切なアクセサと JPA アノテーションで Java クラスが生成されます。

    1. [DbXplorer] ビューで、SalesDBConnection スキーマを右クリックして [JPA マッピングの生成] を選択します。

    2. [Web アプリケーション] ダイアログで、JPA ベースの Web アプリケーション プロジェクト (workshop-jpa-tutorial) を選択し、[OK] をクリックします。

      Workshop では、web/classes/META-INF フォルダに永続性ファイル persistence.xml が含まれている Web アプリケーションは JPA アプリケーションと見なされます。

    3. 次に示すように、[JPA ORM 生成] ダイアログからデータベース テーブルを選択して、[次へ] をクリックします。

      CONTACT データベース テーブルは選択しないようにしてください。このチュートリアルでは、トップダウンの開発手法についてより理解を深めるため、後ほど CONTACT データベース テーブルを使用して手動で POJO クラス Contact を作成し、これにアノテーションを付けて JPA 用のクラスにします。

    4. [テーブルの関連付け] ダイアログに、外部キー定義に基づいてデータベース スキーマから抽出されたエンティティ関係が表示されます。このダイアログでは、各テーブルの関連を選択し、編集パネルでオプションを変更することでそれらを編集できます。

      LINEITEM と ORDER_DATA の間の関連を選択します。
      1 番目の [プロパティ] フィールドの値を、「orderData」から「order」に変更します。
    5. LINEITEM と PRODUCT の間の関連を選択します。

      LINEITEM と PRODUCT の間には、一方向の多対一関係を定義します。[Generate a reference to a collection of Lineitem in Product] チェックボックスの選択を解除します。

    6. ORDER_DATA と CUSTOMER の間の関連付けを選択します。
      2 番目の [プロパティ] フィールドの値を、「orderData」から「orders」に変更します。
      [次へ] をクリックします。
    7. [デフォルト テーブルの生成] ダイアログの [キー ジェネレータ] フィールドで、[なし] が選択されていることを確認します。

      [コレクション プロパティのタイプ] ドロップダウン リストで、[java.util.List] を選択します。

      エンティティ Bean を生成するためには Java パッケージが必要です。[Java パッケージ] フィールドの横の [参照] をクリックして [Java パッケージの選択] ダイアログを表示します。com.bea.beansパッケージを選択して [OK] をクリックします。

      [次へ] をクリックします。
    8. [テーブルとカラム] ダイアログを使用すると、テーブルやカラムのマッピング生成をカスタマイズできます。ただし、このチュートリアルでは、テーブルのカスタマイズは行いません。

      [次へ] をクリックします。
    9. [JPA ORM 生成] で、[JPA コンフィグレーション ファイルを更新] チェック ボックスがチェックされていることを確認します (このチェック ボックスはデフォルトでチェックされています。これにより、persistence.xml ファイルが、上の手順で定義したマッピング情報を含んだ状態に更新されます。

      [終了] をクリックします。

      [ORM の生成] ウィザードで指定したプロパティに基づいて、すべてのアノテーションつきエンティティ Java Bean が生成されます。

    1. AppXplorer] ビューの [JPA コンフィグレーション] ノードからエンティティにアクセスできます。エンティティを表示するには、[AppXplorer] ビューで、[workshop-jpa-tutorial|web|JPA コンフィグレーション| > エンティティ] ノードを開きます。
    2. オブジェクト モデルは、[workshop-jpa-tutorial|web/WEB-INF/src/java|com.bea.beans] に格納されています。
    3. Workshop によって生成された永続性エンティティのセットを表示するには、[workshop-jpa-tutorial|web/WEB-INF/src/java|META-INF] にある persistence.xml ファイルに移動します。

    アノテーション付きで生成されたクラスの内容を確認するには (省略可能)

    各エンティティ マッピングは、以下の 6 つのプロパティ タイプのいずれかであると定義されます。

    エンティティをデータベースから生成する場合は、これらのプロパティに対応する JPA アノテーションが、生成されるソース コードに追加されます。この節では、これらの基本的な JPA アノテーションについて説明します。

    Customer クラスで、以下のアノテーションを確認します。

    1. [AppXplorer] ビューで、workshop-jpa-tutorial|web/WEB-INF/src/java|com.bea.beans|Customer.java ファイルをダブルクリックしてそのソースを表示します。
    2. 基本プロパティ - 基本プロパティは、データベースにそのままの状態で永続化される標準値を扱います。

      @Basic アノテーションの後には、@Column アノテーションが続きます。name 属性は、このプロパティをバインドするカラムの名前を定義します。nullable 属性を false に設定すると、カラムに null 値を格納できなくなります。length 属性は、カラムの最大長を示します。
    3. @Basic()
      @Column(name="NAME", nullable=false, length=255)
      public String getName() {
      return this.name;
      }
      public void setName(String name) {
      this.name = name;
      }
    4. 一対多プロパティ - 一対多プロパティは、単一のエンティティ A が複数のエンティティ B を参照しており、それ以外のエンティティ A が同じエンティティ B を参照することのない関係を示します。

      ここでは、単一の Customer エンティティが複数の OrderData エンティティを参照しており、OrderData エンティティが参照できる Customer エンティティは 1 つに限定されています。

      一対多アノテーションの mappedBy 属性には、OrderData エンティティの多対一フィールドの名前を指定します。これにより、双方向関係のマッピングが形成されます。
    5. @OneToMany(mappedBy="customer", fetch=FetchType.EAGER)
      public java.util.Set<OrderData> getOrders() {
      return this.orders;
      }
      public void setOrders(java.util.Set<OrderData> orders) {
      this.orders = orders;
      }
    6. ID プロパティ - ID プロパティは、主キーなどの識別子を指定します。すべてのエンティティ Bean では、インスタンスの永続 ID を構成する 1 つまたは複数のフィールドを宣言する必要があります。

      ID アノテーションに後には @Column アノテーションが続きます。unique 属性を true に設定すると、SQL でいう UNIQUE カラム (ユニークな値しか格納できないカラム) になります。
    7. @Id()
      @Column(name="CUSTOMERID", unique=true, nullable=false)
      public Integer getCustomerid() {
      return this.customerid;
      }
      public void setCustomerid(Integer customerid) {
      this.customerid = customerid;
      }
    8. クラス ファイル OrderData.java をダブルクリックします。

      多対一プロパティ - 多対一プロパティは、あるエンティティ A が単一のエンティティ B を参照しており、他のエンティティ A も同じエンティティ B を参照している関係を示します。この場合は、A から B への多対一関係になります。

      多対一アノテーションの fetch 属性は、フィールドの永続データをロードするかどうかを指定する列挙体です。ロードのタイミングとしては、永続性プロバイダからエンティティ オブジェクトが返される前 (FetchType.EAGER)、またはそれより後にプロパティがアクセスされたとき (FetchType.LAZY) を指定できます。

      多対一アノテーションの後には @JoinColumn アノテーションが続きます。このアノテーションでは、カラムの name 属性 (プロパティをバインドするカラムの名前) と referencedColumnName 属性 (結合に使用する主キー カラムの名前) を定義します。
      @ManyToOne(fetch=FetchType.EAGER)
      @JoinColumn(name="CUSTOMERID", referencedColumnName="CUSTOMERID")
      public Customer getCustomer() {
      return this.customer;
      }
      public void setCustomer(Customer customer) {
      this.customer = customer;
      }

    EJBQL クエリを実行してマッピングをテストするには (省略可能)

    この手順では、[EJBQL エディタ] の使い方について説明します。[EJBQL エディタ] を使用すると、EJBQL クエリを定義して実行できます。

    1. [DbXplorer] ビューで、[DbXaminer を開く] ボタンをクリックします。

    2. [DbXaminer] ビューで、[EJBQL エディタ] タブをクリックします。

    3. [Current project:] で、Web アプリケーションを参照して workshop-jpa-tutorial を選択します。
    4. [EJBQL エディタ] を使用して EJBQL クエリを定義する際は、〔Ctrl〕+〔Space〕を押すことで、EJBQL キーワードや永続エンティティのコード補完機能を実行できます。ここでは、コード補完機能を使用して EJBQL SELECT クエリを定義します。

      [EJBQL エディタ] で、「S」と入力してから〔Ctrl〕+〔Space〕を押します。「S」で始まる EJBQL キーワードのリストが表示されます。
    5. select キーワードをダブルクリックします。
    6. スペースを 1 つ入力してから、永続オブジェクト Customer のプロパティのデータを取得するためのエリアスとして「c」と入力します。
    7. from」と入力し (または、コード補完機能を使用して from キーワードを選択し)、スペース キーを押します。
    8. 〔Ctrl〕+〔Space〕を押して永続エンティティのリストを取得し、Customer オブジェクトを選択します。
    9. スペースを 1 つ入力してから、Customer エンティティのエリアス「c」を指定します。
    10. これで、EJBQL SELECT クエリが定義できました。このクエリを実行するには、[クエリの実行] ボタンをクリックするか、ショートカット キー〔Ctrl〕+〔Enter〕を押します。
    11. 同じ手順で、特定の顧客 ID を持つ顧客の永続オブジェクト OrderData に対して EJBQL SELECT を実行します。

    チュートリアルを移動するには、矢印をクリックしてください。


    さらにヘルプが必要ですか。質問は Workshop ニュース グループまでお寄せください。