@JoinColumn與@Column標記一樣,是用於注釋表中的字段的。它的屬性與@Column屬性有很多相同之處,這里就不詳細講述。請讀者參閱5.2.2小節中有關@Column屬性的部分。
l @JoinColumn與@Column相區別的是:@JoinColumn注釋的是保存表與表之間關系的字段,它要標注在實體屬性上。而@Column標注的是表中不包含表關系的字段。
l 與@Column標記一樣,name屬性是用來標識表中所對應的字段的名稱。例如customer表中存在字段addr_id,標識的代碼如下所示。
@OneToOne
@JoinColumn(name = "addr_id")
public AddressEO getAddress() {
return address;
}
若此時,不設置name的值,則在默認情況下,name的取值遵循以下規則:
name=關聯表的名稱+“_”+ 關聯表主鍵的字段名
例如,CustomerEO實體中,如果不指定name的值,默認將對應name=address_id;因為@JoinColumn注釋在實體 AddressEO屬性上,實體AddressEO對應的表名為“address”;表address的主鍵是“id”,所以此時對應的默認的字段名稱為 “address_id”。
提示:此規則只適用於與@OneToOne標記同時使用時。若與@ManyToOne或@ManyToMany標記同時使用時,將遵循其他的規則。
l 默認情況下,關聯的實體的主鍵一般是用來做外鍵的。但如果此時不想主鍵作為外鍵,則需要設置referencedColumnName屬性。例如,將address表中增加一個字段“ref_id”,address表的建表SQL變為以下所示。
CREATE TABLE address (
id int(20) NOT NULL auto_increment,
ref_id int int(20) NOT NULL,
province varchar(50) ,
city varchar(50) ,
postcode varchar(50) ,
detail varchar(50) ,
PRIMARY KEY (id)
)
此時,通過customer表中的“address_id”字段關聯的是address表中的“ref_id”,而“ref_id”並不是address表中的主鍵,則實體中標注如代碼下所示。
@OneToOne
@JoinColumn(name = "address_id",referencedColumnName="ref_id")
public AddressEO getAddress() {
return address;
}
屬性referencedColumnName標注的是所關聯表中的字段名,若不指定則使用的所關聯表的主鍵字段名作為外鍵。
l JoinColumn標記不僅能夠與@OneToOne使用,也可以@ManyToOne或@ManyToMany標記同時使用,它們所表示的含義不同,這些內容將在下文詳細講述。