默認情況下,JPA 持續性提供程序在映射多對多關聯(或在單向的一對多關聯中)的擁有方上的實體關聯時使用一個連接表。連接表名稱及其列名均在默認情況下指定,且 JPA 持續性提供程序假設:在關系的擁有方上的實體主表中,每個主鍵列有一個連接列。
通過表關聯的方式來映射一對多或者多對多的關系時,要使用@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屬性為連接兩個表的表名稱。若不指定,則使用默認的表名稱如下所示。
“表名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 屬性
屬性 | 必需 | 說明 |
---|---|---|
|
|
默認值:空 JPA 使用最少量 SQL 創建一個數據庫表列。 如果需要使用更多指定選項創建列,請將 |
|
|
默認值: 默認情況下,JPA 持續性提供程序假設它可以插入到所有表列中。 如果該列為只讀,請將 |
|
|
默認值:如果使用一個連接列,則 JPA 持續性提供程序假設外鍵列的名稱是以下名稱的連接:
如果實體中沒有這樣的引用關系屬性或字段(請參閱 @JoinTable),則連接列名稱格式化為以下名稱的連接:實體名稱 +“_”+ 被引用的主鍵列的名稱。 這是外鍵列的名稱。如果連接針對“一對一”或“多對一”實體關系,則該列位於源實體的表中。如果連接針對“多對多”實體關系,則該列位於連接表(請參閱 @JoinTable)中。 如果連接列名難於處理、是一個保留字、與預先存在的數據模型不兼容或作為數據庫中的列名無效,請將 |
|
|
默認值: 默認情況下,JPA 持續性提供程序假設允許所有列包含空值。 如果不允許該列包含空值,請將 |
|
|
默認值:如果使用一個連接列,則 JPA 持續性提供程序假設在實體關系中,被引用的列名是被引用的主鍵列的名稱。 如果在連接表(請參閱 @JoinTable)中使用,則被引用的鍵列位於擁有實體(如果連接是反向連接定義的一部分,則為反向實體)的實體表中。 要指定其他列名,請將 |
|
|
默認值:JPA 持續性提供程序假設實體的所有持久字段存儲到一個名稱為實體類名稱的數據庫表中(請參閱 @Table)。 如果該列與輔助表關聯(請參閱 @SecondaryTable),請將 |
|
|
默認值: 默認情況下,JPA 持續性提供程序假設允許所有列包含重復值。 如果不允許該列包含重復值,請將 |
|
|
默認值: 默認情況下,JPA 持續性提供程序假設它可以更新所有表列。 如果該列為只讀,則將 |
下例顯示了如何使用此批注使 JPA 將數據庫表 Employee
列 ADDR_ID
用作連接列。