手順 3. エンティティを作成し、管理する
この手順の実施にかかる時間 : 30 分
[JPA ORM 生成] ウィザードを使用すると、既存の O/R マッピングに変更を加えたり、エンティティの新しい関連を作成したりできます。
この手順のタスクは以下のとおりです。
CUSTOMER と CUSTOMERID の間に新しい一対一関係を作成するには
パフォーマンス上の理由等でデータベースに外部キー定義がない場合は、エンティティの新しい関連を作成することもできます。Workshop では、2 つのテーブル間の [単純な関連付け] (一対一、一対多、多対一) と、中間テーブルを介した [多対多の関連付け] を作成できます。
- [DbXplorer] ビューで、SalesDBConnection スキーマを右クリックして [JPA マッピングの生成] を選択します。
- [Web アプリケーション] ダイアログで workshop-jpa-tutorial を選択し、[OK] をクリックします。
- [JPA ORM 生成] ダイアログで、CONTACT 以外のすべてのデータベース テーブルを選択し、[次へ] をクリックします。
![](img/img61.5.jpg)
- [JPA ORM 生成] ダイアログで、[新しい関連付けの作成] リンクをクリックします。
![](img/img62.jpg)
- [新しい関連付けの作成] ダイアログで、[Table 1] ドロップダウン メニューを使用して、[CUSTOMER] を選択します。
[Table 2] ドロップダウン メニューを使用して、[CUSTOMERID] を選択します。
[次へ] をクリックします。
これにより、CUSTOMER テーブルと CUSTOMERID テーブルの間に、単純な一対一関係が作成されます。
![](img/img46.jpg)
- 次に、テーブル間の結合カラムを指定します。
CUSTOMER テーブル ドロップダウン メニューを使用して、CUSTOMERID カラムを選択します。
CUSTOMERID テーブル ドロップダウン メニューを使用して、CUSTOMERID カラムを選択します。
[次へ] をクリックします。
![](img/img47.jpg)
- [1 対 1] を選択して、1 つの顧客 ID に 1 つの顧客が対応することを指定します。
[終了] をクリックします。
![](img/img48.jpg)
新しい関連 (茶色のボックス) はデータベース スキーマから抽出されたものではないため、それぞれのエンティティ Bean にはアノテーションがプログラム的に追加されます。
- [次へ] をクリックします。
- 必要に応じて、[デフォルト テーブルの生成] ページで、[Java パッケージ] フィールドの横にある [参照] をクリックします。[Java パッケージの選択] ダイアログで、[com.bea.beans] を選択して、[OK] をクリックします。
- [デフォルト テーブルの生成] ページで、[完了] をクリックします。
アノテーション付きで生成されたクラスの内容を確認するには
Customer および CustomerId クラスで、以下のアノテーションを確認します。
- 一対一プロパティ - 一対一プロパティは、1 つのエンティティ A が 1 つのエンティティ B を参照し、それ以外のエンティティ A が同じエンティティ B を参照できない関係を示します (この場合は A と B の間の一対一関係になります)。
次に、Customer クラス内での Customer と CustomerId の一対一マッピング関係を示します。
@OneToOne(fetch=FetchType.EAGER)
@JoinColumn(name="CUSTOMERID", referencedColumnName="CUSTOMERID",
nullable=false, insertable=false, updatable=false)
public Customerid getCustomeridBean() {
return this.customeridBean;
}
public void setCustomeridBean(Customerid customeridBean) {
this.customeridBean = customeridBean;
}
|
- 次に、CustomerId クラス内での CustomerId と Customer の一対一マッピング関係を示します。
@OneToOne(mappedBy="customeridBean", fetch=FetchType.EAGER)
public Customer getCustomer() {
return this.customer;
}
public void setCustomer(Customer customer) {
this.customer = customer;
}
|
注意 : 一対一マッピングのアノテーション属性は、一対多および多対一マッピングのアノテーション属性とよく似ています。このチュートリアルの手順 2 の「アノテーション付きで生成されたクラスの内容を確認するには」を参照してください。
既存の Java クラスにアノテーションを追加するには
この手順では、Java クラス Contact を作成し、既存の Java クラス (POJO) にアノテーションを付けて JPA エンティティ Bean にします。この方法では、「トップダウン」の開発シナリオに従います。
- [ファイル|新規|クラス] を選択します。
- [パッケージ] フィールドに、com.bea.beans と入力します。
[名前] フィールドに、Contact と入力します。
[Interfaces] フィールドに、java.io.Serializable と入力します ([追加] ボタンをクリックして、このフィールドに入力します)。
引数を取らないコンストラクタを追加するため、[スーパークラスからのコンストラクター] を選択します。
[完了] をクリックします。
![](img/img63.jpg)
- Contact クラスに以下のプライベート変数 (String 型) を追加します。注意 : ここでは、CONTACT データベース テーブル内のカラムにマップするプロパティを定義しています。
private String contactId;
private String address;
private String city;
private String phone; |
- ソース ビューを右クリックして [ソース|Getter および Setter の生成] を選択し、各変数のゲッター メソッドとセッター メソッドを追加します。[Getter および Setter の生成] ダイアログで、[すべて選択] をクリックして [OK] をクリックします。
- 以下のプロパティを追加します。
private static final long serialVersionUID = 1L;
|
- このチュートリアルでは Set で Contact インスタンスを使用するため、equals( ) および hashCode( ) メソッドをオーバーライドします。
public boolean equals(Object other) { if
( (this == other ) ) return true; if ( !(other instanceof
Contact) ) return false; Contact castOther = (Contact)
other; if( this.getContactId( ).equals(castOther.getContactId(
)) ) { return true; } else
{ return false; }
}
public int hashCode() { return this.getContactId( ).hashCode(
);
} |
- Contact クラスを保存します。これで、CONTACT 永続性データのオブジェクト表現が作成できました。次は、この Contact オブジェクトにアノテーションを付けます。
- [AppXplorer] ビューで、workshop-jpa-tutorial プロジェクトを右クリックします。 [新規|その他] を選択します。[JPA] を展開し、[アノテーション付き Java クラス] を選択して [次へ] をクリックします。
![](img/img64.jpg)
- Java クラスを選択するため、[参照] をクリックします。「contact」と入力し、マップする com.bea.beans.Contact オブジェクトを選択します。
[OK] をクリックします。
![](img/img65.jpg)
- [エンティティ アクセス] ドロップダウン リストで、[property] を選択して [次へ] をクリックします。 ([property] を選択するとクラスのアクセサにアノテーションが追加され、[field] を追加した場合はクラスのフィールドにアノテーションが追加されます。)
![](img/img66.jpg)
- [クラス マッピングのプロパティ] ダイアログで、[データベース テーブル] フィールドの値が「CONTACT」になっており、[主キーのプロパティ] フィールドの値が「contactId」になっていることを確認します。
[次へ] をクリックします。
![](img/img67.jpg)
-
[Bean プロパティのマッピング] ダイアログでは、Contact java クラスでアノテーションを付けたフィールドとデータベース カラムの間のマッピングを確認できます。なお、プロパティ マッピングを選択して [編集] をクリックすると、選択したプロパティ マッピングを変更できます。このチュートリアルでは、マッピング情報を変更する必要はありません。
[完了] をクリックします。
![](img/img69.jpg)
- アノテーション付きの Contact クラスを編集して、Customer との双方向の多対一マッピング関係を追加します。
- 新しい多対一カラム結合を追加するため、以下の javax.persistence クラスをインポートします。
import javax.persistence.JoinColumn;
import javax.persistence.ManyToOne; |
- Customer 型のプロパティ customer を追加します。
private Customer customer; |
- Customer との多対一関係を追加するため、Contact エンティティに以下のアノテーションを追加します。@JoinColumn アノテーションでは、プロパティをバインドするカラムの名前 (name 属性) と、結合する主キー カラムの名前 (referencedColumnName 属性) を定義します。
@ManyToOne()
@JoinColumn(name="CUSTOMERID", referencedColumnName="CUSTOMERID")
public Customer getCustomer() {
return this.customer;
}
public void setCustomer(Customer customer) {
this.customer = customer;
} |
- 上の手順で Contact エンティティに多対一 customer プロパティを定義したので、Customer エンティティには一対多 contact プロパティが必要になります。
- Customer クラスを開きます。
- java.util.Set 型の contacts プロパティを追加します。
private java.util.Set<Contact> contacts;
|
- Contact との一対多関係を追加するため、Customer エンティティに以下のアノテーションを追加します。@OnetoMany アノテーションでは、Contact エンティティの多対一フィールドの名前を MappedBy 属性として定義します。この双方向関係は、ここで指定したフィールドでマッピングされます。
@OneToMany(mappedBy="customer")
public java.util.Set<Contact> getContacts() {
return this.contacts;
}
public void setContacts(java.util.Set<Contact> contacts) {
this.contacts = contacts;
} |
- Customer クラスを保存します。
EJBQL を実行して新しいマッピングが正常に機能することを確認するには
この手順では、JPA ORM マッピング ツールを使用して、Customer エンティティと CustomerId エンティティの間の新しい関連を作成しました。また、既存の Java クラス Contact にアノテーションを付けて JPA エンティティ Bean にしました。この節では、[EJBQL エディタ] を使用して実行時の動作をテストします。
- Customer と CustomerId の間の双方向一対一マッピングをテストします。[EJBQL エディタ] で次のクエリを実行します。
select c from Customer c where c.customeridBean.customerid = 101
![](img/img70.jpg)
- CustomerId と Customer の間の双方向一対一マッピングをテストします。[EJBQL エディタ] で次のクエリを実行します。
select c from Customerid c where c.customer.customerid = 101
![](img/img71.jpg)
- Contact と Customer の間の双方向多対一マッピングをテストします。[EJBQL エディタ] で次のクエリを実行します。
select c from Customerid c where c.customer.customerid = 101
![](img/img72.jpg)
チュートリアルを移動するには、矢印をクリックしてください。
さらにヘルプが必要ですか。質問は Workshop
ニュース グループまでお寄せください。