エンティティクラスを作成するには、新規 JPA エンティティウィザードを使用することで、@Entityアノテーションなどが設定されたクラスを生成することができます。
ポイント
データベースのテーブルからエンティティクラスを生成することもできます。
詳細は、"4.3.3.4 テーブルからエンティティクラスを生成する"を参照してください。
JPAパースペクティブを開く
はじめにJPAパースペクティブを開きます。
エンティティクラスの作成
エンティティクラスの作成は、新規ウィザードから[JPA] > [エンティティ]を選択し、ウィザードで作成します。ウィザードでの設定は、以下を参考にしてください。
プロジェクト
エンティティクラスを生成するプロジェクトを指定します。
ソースフォルダ
エンティティクラスのソースを格納するフォルダを指定します。
Java パッケージ
エンティティクラスのパッケージ名を指定します。
クラス名
エンティティクラス名を指定します。
継承
エンティティクラスが継承するクラスを"エンティティ"か"マップドスーパークラス"から選択します。
XMLエンティティマッピング
O/Rマッピングファイルにエンティティを追加する場合は、"XMLのエンティティマッピングに追加"をチェックします。
エンティティ名
エンティティ名を指定します。
テーブル名
既存のテーブルと関連付ける場合は、"デフォルトを使用"のチェックをはずして、テーブル名を指定します。
エンティティフィールド
エンティティフィールドを追加します。フィールド名と型を指定して追加します。主キーとするフィールドは、"キー"をチェックします。
アクセスタイプ
エンティティのアクセスタイプを"フィールドベース"か"プロパティベース"かを指定します。
アノテーションの設定
[JPA構造]ビューをアクティブにして、作成したエンティティクラスを選択します。[JPA詳細]ビューの [タイプ]で表示されているマッピングタイプをクリックします。[マッピングタイプの選択]ダイアログボックスでマッピングタイプを選択すると、エンティティクラスにアノテーションが設定されます。
Entityは、継承や埋め込みなどを利用し複雑なデータ構成にも対応したものも作成できます。
詳細は、"4.3.3.1 データ構成を考慮してエンティティを作成する"を参照してください。
ポイント
Javaクラスをエンティティにする場合は、JPA構造ビューにJavaクラスが表示されないため、Javaソースに直接アノテーション定義を追加してください。
エンティティクラスとデータベースのマッピング
エンティティクラスとデータベースとをマッピングする場合は、[JPA詳細]ビューの[テーブル]グループにある[名前]コンボボックスで、データベースのテーブル名を指定します。クラス名と同じ名前のテーブルとマッピングする場合は、デフォルトのままでかまいません。
エンティティクラスのフィールドとデータベースのカラムもマッピングできます。エンティティクラスにフィールドを作成して、そのフィールドを[JPA構造]ビューで選択します。[JPA詳細]ビューの[カラム]グループにある[名前]コンボボックスで、データベースのテーブル名を指定します。フィールド名と同じ名前のカラムとマッピングする場合は、デフォルトのままでかまいません。
ポイント
プロジェクトに設定したデータベースに接続している場合は、[JPA詳細]ビューのコンボボックスにマッピングできる候補が一覧されます。
データベースとのマッピングは、単純なテーブルやカラムとの対応付け以外も行うことができます。
データベースとのマッピングの詳細は、"4.3.3.2 エンティティとデータベースをマッピングする"を参照してください。
また、Entity間の関係についてもデータベースの情報と絡めてマッピングすることができます。
詳細は、"4.3.3.3 エンティティ間の関係を定義する"を参照してください。
ポイント
データベースとのマッピングはアノテーションだけでなく、O/Rマッピングファイルでも行うことができます。複数の環境で使用する場合などアプリケーションの可搬性を高めたい場合は、O/Rマッピングファイルを利用してください。
エンティティはエンティティを継承して作成することができます。エンティティ以外にも共通の永続化項目を特殊なスーパークラスで管理し、それを継承して作成することもできます。そのスーパークラスを作成するには、@MappedSuperclassアノテーションを設定します。
継承してエンティティを作成した場合、継承している永続化項目の属性を上書きして変更することや、継承している各エンティティのデータベーステーブルへのマッピング方法を指定することができます。これらには、@AttributeOverrideアノテーションや@Inheritanceアノテーションを使用します。
また、関連する永続項目をまとめて特殊なクラスとして管理し、エンティティのフィールドの型として使用することで、エンティティに特殊なクラスを埋め込むこともできます。その特殊なクラスを作成するには、@Embeddableアノテーションを設定し、エンティティに埋め込む場合には@Embeddedもしくは@EmbeddedIdアノテーションをエンティティのフィールドに設定します。
埋め込みを行った場合、埋め込んだクラスの永続項目の属性を上書きして変更することもできます。
MappedSuperclassアノテーションの設定
[JPA構造]ビューでスーパークラスを選択します。[JPA詳細]ビューの[タイプ]で表示されているマッピングタイプをクリックします。[マッピングタイプの選択]ダイアログで"Mapped Superclass"を選択すると、@MappedSuperclassアノテーションが設定されます。
Javaクラスの場合は、クラスファイルをJavaエディタで開き、直接アノテーションを定義してください。
AttributeOverrideアノテーションの設定
[JPA構造]ビューでエンティティクラスを選択します。[JPA詳細]ビューの[属性の上書き]で、上書きしたい永続項目を選択し、属性の上書きを行います。
Inheritanceアノテーションの設定
[JPA構造]ビューで階層のルートのエンティティクラスを選択します。[JPA詳細]ビューの[継承]で、エンティティのデータベーステーブルへのマッピング方法を指定します。
設定については、以下を参考にしてください。
方法
テーブルのマッピング方法について以下から選択します。
単一テーブル
継承関係にあるすべてのエンティティを1つのテーブルにマッピングします。この方式の場合、データベースのテーブルの各行が継承関係にあるエンティティクラスのどのデータかを示すためのカラム(識別カラム)がテーブルに必要になります。
JOINED
各エンティティクラス単位にテーブルにマッピングします。各テーブルにはそのエンティティクラス固有の永続項目(継承している永続項目を含まない)に対応するカラムと結合カラムを定義します。結合カラムは、階層のルートのエンティティに対応するテーブル(主テーブル)の主キーに対応付けるためのカラムです。
クラス毎にテーブル
各エンティティクラス単位にテーブルにマッピングし、そのエンティティクラスの永続項目 (継承している永続項目を含む)に対応するカラムを定義します。
識別カラム、識別タイプ、識別値
方法として"単一テーブル"を選択した場合に指定します。識別値は、継承関係にあるエンティティクラスを識別するための値を設定します。
これらの項目は、@DiscriminatorColumn、@DiscriminatorValueアノテーションに相当します。
主キー結合カラム
方法として"JOINED"を選択した場合に指定します。現在のエンティティの主キーのカラムと主テーブルの主キーのカラムから参照されるカラムをペアで指定します。
この項目は、@PrimaryKeyJoinColumnアノテーションに相当します。
Embeddableアノテーションの設定
[JPA構造]ビューでJavaクラスを選択します。[JPA詳細]ビューの[タイプ]で表示されているマッピングタイプをクリックします。[マッピングタイプの選択]ダイアログで"Embeddable"を選択すると、@Embeddableアノテーションが設定されます。
Javaクラスの場合は、クラスファイルをJavaエディタで開き、直接アノテーションを定義してください。
EmbeddedもしくはEmbeddedIdアノテーションの設定
[JPA構造]ビューでエンティティクラスの@Embeddableアノテーションを設定したクラス型の永続項目を選択します。[JPA詳細]ビューの[属性]で表示されているマッピングタイプをクリックします。[マッピングタイプの選択]ダイアログで"Embedded"もしくは"Embedded Id"を選択すると、永続項目に@Embeddedアノテーションもしくは@EmbeddedIdアノテーションが設定されます。
"Embedded" を選択した場合、[JPA詳細]ビューの[属性の上書き]で、@Embeddableアノテーションを設定したクラスの属性を上書きして変更することができます。
エンティティとデータベーステーブルをマッピングするには、@Tableアノテーションを使用します。また、エンティティを1つ以上のデータベーステーブルとマッピングすることもでき、その場合には、@SecondaryTableアノテーションを使用します。
エンティティとテーブルをマッピングした場合には、永続項目とカラムは名前で対応付けられますが、永続項目単位にデータベースのカラムにマッピングすることもできます。また、主キーになる永続項目を宣言する必要があります。
マッピングするカラムの情報以外にも、データ読み込み(フェッチ)の方法を指定したり、型に関するオプションを指定したり、永続化しない項目やOptimistic Lockingに使用する項目を指定することもできます。
Tableアノテーションの設定
[JPA構造]ビューでエンティティクラスを選択します。[JPA詳細]ビューの[テーブル]で、テーブル名、カタログ、スキーマを指定します。
SecondaryTableアノテーションの設定
[JPA構造]ビューでエンティティクラスを選択します。[JPA詳細]ビューの[二次テーブル]で、主テーブル(@Tableアノテーションで指定したもの)以外のテーブルを追加します。
[主キー結合カラム]は、主テーブルの主キーと二次テーブルとして追加したテーブルのどのカラムを対応付けるかを指定します。
永続項目とカラムのマッピング
[JPA構造]ビューでエンティティクラスの永続項目を選択します。[JPA詳細]ビューの[カラム]で、カラム名、テーブルを指定します。
[挿入可能]、[更新可能]は、その永続項目に対応するカラムを挿入や更新対象とするかを指定する項目です。
主キーの設定
[JPA構造]ビューでエンティティクラスの主キーになる永続項目を選択します。[JPA詳細]ビューの[属性]で表示されているマッピングタイプで"Id"を選択します。すると、フィールドに@Idアノテーションが設定されます。
プログラム内で主キーの値を明示的に設定せずに、主キーの値を自動的に生成する場合には、上記の[JPA詳細]ビューの[主キーの生成]で行います。設定については、以下を参考にしてください。
この項目は、@GeneratedValue、@TableGenerator、@SequenceGeneratorアノテーションに相当します。
方法
主キーの生成方法について以下から選択します。
自動
実行環境がデータベースに適切な生成方法を選択します。
識別
データベースのIDENTITYカラムを使用します。
シーケンス
データベースのシーケンスを使用します。
テーブル
データベースのテーブルを使用します。
ジェネレータ名
テーブルジェネレータやシーケンスジェネレータで指定した名前を指定します。
テーブルジェネレータ
名前はジェネレータ名に指定する名前です。値カラムはジェネレータで生成した値を格納するカラムです。主キーカラムの値は、このテーブルが複数の主キーの生成に使われる場合に、どのジェネレータのものか識別するための値を指定します。(主キーカラムと値カラムにこの値と最後に生成された主キーの値がペアで格納されます。)
シーケンスジェネレータ
名前はジェネレータ名に指定する名前です。シーケンスには、データベースのシーケンス名を指定します。
[JPA構造]ビューで永続項目を選択している状態で、[JPA詳細]ビューの[フェッチ]でフェッチ方法の指定を行います。
設定については、以下を参考にしてください。
EAGER
Entityが取得されるときにフェッチされなければいけない場合に指定します。
LAZY
最初に永続項目にアクセスされるときにフェッチしてもいい場合に指定します。
永続項目の型が日時関連の場合には、Date(日付)、Time(時間)、Timestamp(日時)のどれに対応付けるかを指定できます。これには、@Temporalアノテーションを使用します。
@Temporalアノテーションを設定するには、[JPA構造]ビューで日時関連の型の永続項目を選択し、[JPA詳細]ビューの[日時型]でコンボボックスから対応付ける方法を選択します。
永続項目が列挙型の場合には、値をOrdinal(序数)とString(文字列)のどちらで扱うかを指定できます。これには、@Enumeratedアノテーションを使用します。
@Enumeratedアノテーションを設定するには、[JPA構造]ビューで列挙型の永続項目を選択し、[JPA詳細]ビューの[列挙型]でコンボボックスから扱い方を選択します。
巨大オブジェクト型に関するオプションの指定
永続項目の型が、データベースの巨大オブジェクト型(LOB)に対応付けられる型の場合に巨大オブジェクトとして扱うかを指定できます。これには、@Lobアノテーションを使用します。
@Lobアノテーションを設定するには、[JPA構造]ビューで巨大オブジェクト型に対応付けられる永続項目を選択し、[JPA詳細]ビューの[Lob]をチェックします。
永続化しない項目の指定
エンティティクラスに宣言されるフィールドやプロパティは、デフォルトで永続化対象として扱われてしまいます。永続化しない項目については、@Transientアノテーションを設定する必要があります。
@Transientアノテーションを設定するには、[JPA構造]ビューで永続化しない項目を選択し、[JPA詳細]ビューの[属性]で表示されているマッピングタイプで"Transient"を選択します。
Optimistic Lockingを適用する項目の指定
エンティティ間の関係には、1対1、多対1、1対多、多対多の関係があります。関係には方向性もあり、どちらからも参照できる双方向と、片側からしか参照できない単方向があります。
エンティティ間の関係を定義するには、参照される側のEntity型やそのコレクション型のフィールドやプロパティをエンティティに定義し、関係の種別に合わせて@OneToOne、@ManyToOne、@OneToMany、@ManyToManyアノテーションを使用します。
1対1の関係もしくは多対1の関係を定義する
参照する側のエンティティに参照される側のEntity型のフィールドもしくはプロパティを追加します。[JPA構造]ビューで追加した項目を選択し、[JPA詳細]ビューの[属性]で表示されているマッピングタイプで"One to One"もしくは"Many to One"を選択し、関係の定義を行います。関係の定義については、以下を参考にしてください。
対象のEntity
フィールドもしくはプロパティの型から判別可能なため指定する必要はありません。
フェッチ
参照先のEntityをどのタイミングでフェッチするかを以下から選択します。
EAGER
エンティティが取得されるときにフェッチされなければいけない場合に指定します。
LAZY
最初にアクセスされるときにフェッチしてもいい場合に指定します。
所有側
関係が双方向の場合に、被所有者側の定義から所有側の永続項目を指定します。
1対1の関係の場合には、外部キーを持つ側が所有側になります。
多対1の関係の場合には、多側が所有側になるため、この領域を指定することはできません。
カスケード
参照先のエンティティにカスケードする永続化処理(メソッド)を選択します。例えば、エンティティ自身が削除された場合に参照先まで削除を実施するかなどを考慮して選択します。
結合カラム
1対1もしくは多対1の関係の場合には、外部キーを使って関係を定義します。そのため、結合カラムとしては、外部キーのカラムの名前とそれによって参照される参照先のカラム名などを指定します。
この項目は、@JoinColumnアノテーションに相当します。
1対多の関係もしくは多対多の関係を定義する
参照する側のエンティティに参照される側のエンティティのコレクション型のフィールドもしくはプロパティを追加します。[JPA構造]ビューで追加した項目を選択し、[JPA詳細]ビューの[属性]で表示されているマッピングタイプで"One to Many"もしくは"Many to Many"を選択し、関係の定義を行います。
関係の定義については、以下を参考にしてください。(1対1もしくは多対1と同一のものは省略しています。)
対象のEntity
コレクション型を宣言する場合に総称を使用していれば、フィールドもしくはプロパティの型から判別可能なため指定する必要はありません。総称を使用していない場合は、参照先のEntity型を指定します。
所有側
1対多の関係の場合には多側が所有側になるため、双方向の場合にはこの領域を指定します。
多対多の関係で双方向の場合には、どちらかを所有側に決めて、被所有側でこの領域を指定します。
カスケード
参照先のエンティティにカスケードする永続化処理(メソッド)を選択します。例えば、エンティティ自身が削除された場合に参照先まで削除を実施するかなどを考慮して選択します。
順序
フェッチする場合の参照先のエンティティの順序を指定します。
この項目は、@OrderByアノテーションに相当します。
結合テーブル
1対多もしくは多対多の関係の場合には、結合テーブルを使って関係を定義します。結合テーブルには、所有者側と被所有者側に対応するカラムが必要で、それぞれについてカラムの名前とそのカラムから参照されるエンティティに対応するテーブルのカラムを指定します。
この項目は、@JoinTableアノテーションに相当します。
データベースの接続をプロジェクトに設定している場合は、以下の手順でデータベースのテーブルからエンティティクラスを生成することができます。
[データソースエクスプローラ]ビューでプロジェクトに設定したデータベースに接続します。
データベースに接続する詳細については、"6.3.1 データベースに接続する"を参照してください。
プロジェクトを右クリックして、[JPAツール] > [Entityの生成]を選択します。
表示された[Entityの生成]ダイアログボックスで、テーブルを選択して、ソースフォルダやパッケージを入力します。