@JoinTableと@JoinColumn

4069 ワード

デフォルトでは、JPA持続性プロバイダは、複数対の複数の関連付け(または一方向の1対の複数の関連付け)の所有者のエンティティ関連付けをマッピングするときに接続テーブルを使用します.ジョイン・テーブル名とそのカラム名はデフォルトで指定されており、JPA持続性プロバイダは、リレーションシップの所有者のエンティティ・プライマリ・テーブルに各プライマリ・キー・カラムにジョイン・カラムがあると仮定します.
1対多または複数対多の関係をテーブルに関連付けてマッピングする場合は、@JoinTableというタグを使用します.このタグの定義は以下の通りです.
@Target({METHOD, FIELD})
public @interface JoinTable {
String name() default "";
String catalog() default "";
String schema() default "";
JoinColumn[] joinColumns() default {};
JoinColumn[] inverseJoinColumns() default {};
UniqueConstraint[] uniqueConstraints default {};
}
この@JoinTableタグを使用する場合は、以下の点に注意してください.
lこのタグは、@Tableコメントと同様に、関連するテーブルを注釈するために使用される.メソッドまたはプロパティに表示できます.プロパティcatalog、schema、uniqueConstraintは@Tableコメントのプロパティの意味と似ています.@Tableコメントの説明を参照してください.
l nameプロパティは、2つのテーブルを接続するテーブル名です.指定しない場合は、次のようにデフォルトのテーブル名を使用します.
「テーブル名1」+「」+「テーブル名2」.
たとえば、上記のコードでnameの名前を指定しない場合、デフォルトの保存関係の名前は次のようになります.
“customer_address”.
l joinColumnsプロパティは、関係を保存するテーブルで、関連関係を保存する外部キーのフィールドを表します.@JoinColumnタグに合わせて使用します.
たとえば、フィールドcustomer_を表すマッピング構成idは、customerテーブルに関連付けられたidフィールドです.
joinColumns={
         @JoinColumn(name="customer_id",referencedColumnName="id")
}
l inverseJoinColumnsプロパティはjoinColumnsプロパティと類似しており、関係を保存する別の外部キーフィールドが保存されています.
たとえば、フィールドaddressを表すマッピング構成idは、addressテーブルに関連付けられたidフィールドです.
inverseJoinColumns={
         @JoinColumn(name="address_id",referencedColumnName="id")
}
ヒント:@JoinTableは一対多の関連を定義するだけでなく、多対多のテーブルの関連を定義することもできます.
@JoinColumn
デフォルトでは、エンティティの関連付けで、JPA持続性プロバイダは、フィールドや属性名などの既存の名前に基づくデータベース・モードを使用して、使用する単一の接続列(外部キーを含む列)を自動的に決定できます.
以下の条件で@JoinColumnを使用
@JoinColumnプロパティ
ツールバーの
必須
説明columnDefinition
デフォルト:空のString.JPAは、最小SQLを使用してデータベーステーブル列を作成します.さらに指定したオプションを使用して列を作成する必要がある場合は、columnDefinitionを、列に対してDDLを生成するときにJPAで使用するString SQLフラグメントに設定します.insertable
デフォルト:true.デフォルトでは、JPA持続性プロバイダは、すべてのテーブル列に挿入できると仮定します.カラムが読み取り専用の場合は、insertablefalseに設定します.name
デフォルト:接続列が1つ使用されている場合、JPA持続性プロバイダは、外部キー列の名前が次の名前の接続であると仮定します.
参照関係属性の名前+""+参照されるプライマリ・キー列の名前.
参照エンティティのフィールド名+「」+参照されるプライマリ・キー列の名前.
エンティティにこのような参照関係属性またはフィールドがない場合(@JoinTableを参照)、接続カラム名は、エンティティ名+""+のようにフォーマットされます.参照されるプライマリ・キー列の名前.外部キー列の名前です.接続が1対1または複数対1のエンティティ関係の場合、そのカラムはソースエンティティのテーブルに配置されます.接続が複数対複数のエンティティ関係の場合、この列は接続テーブル(@JoinTableを参照)に表示されます.接続カラム名が扱いにくい、予約ワードである、既存のデータモデルと互換性がない、またはデータベース内のカラム名として無効な場合は、nameを必要なStringカラム名に設定します.nullable
デフォルト:true.デフォルトでは、JPA持続性プロバイダは、すべてのカラムにNULL値を含めることを許可すると仮定します.カラムにNull値を含めることができない場合は、nullablefalseに設定します.referencedColumnName
デフォルト:接続カラムを使用する場合、JPA持続性プロバイダは、エンティティ関係で参照されるカラム名が参照されるプライマリ・キー・カラムの名前であると仮定します.接続テーブル(@JoinTableを参照)で使用する場合、参照されるキー列は、エンティティ(接続が逆接続定義の一部である場合は逆エンティティ)を持つエンティティテーブルにあります.他のカラム名を指定するには、referencedColumnNameを必要なStringカラム名に設定します.table
デフォルト:JPA持続性プロバイダは、エンティティのすべての永続フィールドがエンティティ・クラス名のデータベース・テーブルに格納されていると仮定します(@Tableを参照).列がサブテーブルに関連付けられている場合(@SecondaryTableを参照)、例1-8に示すように、nameを対応するサブテーブル名のString名に設定します.unique
デフォルト:false.デフォルトでは、JPA持続性プロバイダは、すべてのカラムに重複値を含めることを許可すると仮定します.カラムに重複値を含めることができない場合は、uniquetrueに設定します.updatable
デフォルト:true.デフォルトでは、JPA持続性プロバイダは、すべてのテーブル列を更新できると仮定します.カラムが読み取り専用の場合、updatablefalseに設定されます.
 
 
次の例では、この注釈を使用して、JPAが接続列としてデータベーステーブルEmployeeADDR_IDを使用する方法を示します.
 
@Entity public class Employee implements Serializable { ... @ManyToOne @JoinColumn(name="ADDR_ID") public Address getAddress() { return address; } }