手順 2. O/R マッピングを生成し、EJBQL でテストする
この手順の実施にかかる時間 : 15 分
Workshop は、BEA Kodo JPA のような一般的な永続性サービスを利用するための、多彩で柔軟性のあるオブジェクト リレーショナル マッピング インタフェースを備えています。O/R マッピングは、開発手法に応じて以下の異なるメカニズムで生成できます。
スキーマをリバース エンジニアリングしてオブジェクト リレーショナル マッピングを作成する
オブジェクト モデルからマッピングを生成する
この手順のタスクは以下のとおりです。
[JPA ORM 生成] ウィザードを使用して、アノテーション付きの POJO をスキーマから生成するには
この手順では、Workshop を使用してスキーマをリバース エンジニアリングする方法で、既存のデータベース スキーマから JPA エンティティ Bean を自動的に生成します。これにより、適切なアクセサと JPA アノテーションで Java クラスが生成されます。
- [DbXplorer] ビューで、SalesDBConnection スキーマを右クリックして [JPA マッピングの生成] を選択します。
- [Web アプリケーション] ダイアログで、JPA ベースの Web アプリケーション プロジェクト (workshop-jpa-tutorial) を選択し、[OK] をクリックします。
Workshop では、web/classes/META-INF フォルダに永続性ファイル persistence.xml が含まれている Web アプリケーションは JPA アプリケーションと見なされます。
- 次に示すように、[JPA ORM 生成] ダイアログからデータベース テーブルを選択して、[次へ] をクリックします。
CONTACT データベース テーブルは選択しないようにしてください。このチュートリアルでは、トップダウンの開発手法についてより理解を深めるため、後ほど CONTACT データベース テーブルを使用して手動で POJO クラス Contact を作成し、これにアノテーションを付けて JPA 用のクラスにします。
- グレー表示されている [Copy driver and add to the build path] チェックボックスに注意してください。これにより、Hypersonic データベース用の JDBC ドライバがプロジェクト クラスパスに追加されます。このドライバは、この時点ですでにプロジェクト ビルドパスに存在しています。
- [テーブルの関連付け] ダイアログに、外部キー定義に基づいてデータベース スキーマから抽出されたエンティティ関係が表示されます。このダイアログでは、各テーブルの関連を選択し、編集パネルでオプションを変更することでそれらを編集できます。
LINEITEM と ORDER_DATA の間の関連を選択します。
1 番目の [プロパティ] フィールドの値を、「orderData」から「order」に変更します。
- LINEITEM と PRODUCT の間の関連を選択します。
LINEITEM と PRODUCT の間には、一方向の多対一関係を定義します。[Generate a reference to a collection of Lineitem in Product] チェックボックスの選択を解除します。
- ORDER_DATA と CUSTOMER の間の関連付けを選択します。
2 番目の [プロパティ] フィールドの値を、「orderData」から「orders」に変更します。
[次へ] をクリックします。
- [デフォルト テーブルの生成] ダイアログの [キー ジェネレータ] フィールドで、[なし] が選択されていることを確認します。
[コレクション プロパティのタイプ] ドロップダウン リストで、[java.util.List] を選択します。
エンティティ Bean を生成するためには Java パッケージが必要です。[Java パッケージ] フィールドの横の [参照] をクリックして [Java パッケージの選択] ダイアログを表示します。com.bea.beansパッケージを選択して [OK] をクリックします。
[次へ] をクリックします。
- [テーブルとカラム] ダイアログを使用すると、テーブルやカラムのマッピング生成をカスタマイズできます。ただし、このチュートリアルでは、テーブルのカスタマイズは行いません。
[次へ] をクリックします。
- [JPA ORM 生成] で、[JPA コンフィグレーション ファイルを更新] チェック ボックスがチェックされていることを確認します (このチェック ボックスはデフォルトでチェックされています。これにより、persistence.xml ファイルが、上の手順で定義したマッピング情報を含んだ状態に更新されます。
[終了] をクリックします。
[ORM の生成] ウィザードで指定したプロパティに基づいて、すべてのアノテーションつきエンティティ Java Bean が生成されます。
- AppXplorer] ビューの [JPA コンフィグレーション] ノードからエンティティにアクセスできます。エンティティを表示するには、[AppXplorer] ビューで、[workshop-jpa-tutorial|web|JPA コンフィグレーション|
> エンティティ] ノードを開きます。
- オブジェクト モデルは、[workshop-jpa-tutorial|web/WEB-INF/src/java|com.bea.beans] に格納されています。
- Workshop によって生成された永続性エンティティのセットを表示するには、[workshop-jpa-tutorial|web/WEB-INF/src/java|META-INF] にある persistence.xml ファイルに移動します。
アノテーション付きで生成されたクラスの内容を確認するには (省略可能)
各エンティティ マッピングは、以下の 6 つのプロパティ タイプのいずれかであると定義されます。
エンティティをデータベースから生成する場合は、これらのプロパティに対応する JPA アノテーションが、生成されるソース コードに追加されます。この節では、これらの基本的な JPA アノテーションについて説明します。
Customer クラスで、以下のアノテーションを確認します。
- [AppXplorer] ビューで、workshop-jpa-tutorial|web/WEB-INF/src/java|com.bea.beans|Customer.java ファイルをダブルクリックしてそのソースを表示します。
- 基本プロパティ - 基本プロパティは、データベースにそのままの状態で永続化される標準値を扱います。
@Basic アノテーションの後には、@Column アノテーションが続きます。name 属性は、このプロパティをバインドするカラムの名前を定義します。nullable 属性を false に設定すると、カラムに null 値を格納できなくなります。length 属性は、カラムの最大長を示します。
@Basic()
@Column(name="NAME", nullable=false, length=255)
public String getName() {
return this.name;
}
public void setName(String name) {
this.name = name;
} |
- 一対多プロパティ - 一対多プロパティは、単一のエンティティ A が複数のエンティティ B を参照しており、それ以外のエンティティ A が同じエンティティ B を参照することのない関係を示します。
ここでは、単一の Customer エンティティが複数の OrderData エンティティを参照しており、OrderData エンティティが参照できる Customer エンティティは 1 つに限定されています。
一対多アノテーションの mappedBy 属性には、OrderData エンティティの多対一フィールドの名前を指定します。これにより、双方向関係のマッピングが形成されます。
@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;
} |
- ID プロパティ - ID プロパティは、主キーなどの識別子を指定します。すべてのエンティティ Bean では、インスタンスの永続 ID を構成する 1 つまたは複数のフィールドを宣言する必要があります。
ID アノテーションに後には @Column アノテーションが続きます。unique 属性を true に設定すると、SQL でいう UNIQUE カラム (ユニークな値しか格納できないカラム) になります。
@Id()
@Column(name="CUSTOMERID", unique=true, nullable=false)
public Integer getCustomerid() {
return this.customerid;
}
public void setCustomerid(Integer customerid) {
this.customerid = customerid;
} |
- クラス ファイル 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 クエリを定義して実行できます。
- [DbXplorer] ビューで、[DbXaminer を開く] ボタンをクリックします。
- [DbXaminer] ビューで、[EJBQL エディタ] タブをクリックします。
- [Current project:] で、Web アプリケーションを参照して workshop-jpa-tutorial を選択します。
- [EJBQL エディタ] を使用して EJBQL クエリを定義する際は、〔Ctrl〕+〔Space〕を押すことで、EJBQL キーワードや永続エンティティのコード補完機能を実行できます。ここでは、コード補完機能を使用して EJBQL SELECT クエリを定義します。
[EJBQL エディタ] で、「S」と入力してから〔Ctrl〕+〔Space〕を押します。「S」で始まる EJBQL キーワードのリストが表示されます。
- select キーワードをダブルクリックします。
- スペースを 1 つ入力してから、永続オブジェクト Customer のプロパティのデータを取得するためのエリアスとして「c」と入力します。
- 「from」と入力し (または、コード補完機能を使用して from キーワードを選択し)、スペース キーを押します。
- 〔Ctrl〕+〔Space〕を押して永続エンティティのリストを取得し、Customer オブジェクトを選択します。
- スペースを 1 つ入力してから、Customer エンティティのエリアス「c」を指定します。
- これで、EJBQL SELECT クエリが定義できました。このクエリを実行するには、[クエリの実行] ボタンをクリックするか、ショートカット キー〔Ctrl〕+〔Enter〕を押します。
- 同じ手順で、特定の顧客 ID を持つ顧客の永続オブジェクト OrderData に対して EJBQL SELECT を実行します。
チュートリアルを移動するには、矢印をクリックしてください。
さらにヘルプが必要ですか。質問は Workshop
ニュース グループまでお寄せください。