|
@OneToOne注釋只能確定實(shí)體與實(shí)體的關(guān)系是一對(duì)一的關(guān)系,不能指定數(shù)據(jù)庫表中的保存的關(guān)聯(lián)字段。所以此時(shí)要結(jié)合@JoinColumn標(biāo)記來指定保存實(shí)體關(guān)系的配置。
@JoinColumn與本書上一章講述的@Column注釋類似,它的定義如下代碼所示。 @Target({METHOD, FIELD}) @Retention(RUNTIME) public @interface JoinColumn { String name() default ""; String referencedColumnName() default ""; boolean unique() default false; boolean nullable() default true; boolean insertable() default true; boolean updatable() default true; String columnDefinition() default ""; String table() default ""; } 在使用@JoinColumn注釋時(shí),應(yīng)注意以下幾個(gè)問題。 l @JoinColumn與@Column標(biāo)記一樣,是用于注釋表中的字段的。它的屬性與@Column屬性有很多相同之處,這里就不詳細(xì)講述。請(qǐng)讀者參閱5.2.2小節(jié)中有關(guān)@Column屬性的部分。 l @JoinColumn與@Column相區(qū)別的是:@JoinColumn注釋的是保存表與表之間關(guān)系的字段,它要標(biāo)注在實(shí)體屬性上。而@Column標(biāo)注的是表中不包含表關(guān)系的字段。 l 與@Column標(biāo)記一樣,name屬性是用來標(biāo)識(shí)表中所對(duì)應(yīng)的字段的名稱。例如customer表中存在字段addr_id,標(biāo)識(shí)的代碼如下所示。 @OneToOne @JoinColumn(name = "addr_id") public AddressEO getAddress() { return address; } 若此時(shí),不設(shè)置name的值,則在默認(rèn)情況下,name的取值遵循以下規(guī)則: name=關(guān)聯(lián)表的名稱+“_”+ 關(guān)聯(lián)表主鍵的字段名 例如,CustomerEO實(shí)體中,如果不指定name的值,默認(rèn)將對(duì)應(yīng)name=address_id;因?yàn)锧JoinColumn注釋在實(shí)體 AddressEO屬性上,實(shí)體AddressEO對(duì)應(yīng)的表名為“address”;表address的主鍵是“id”,所以此時(shí)對(duì)應(yīng)的默認(rèn)的字段名稱為 “address_id”。 提示:此規(guī)則只適用于與@OneToOne標(biāo)記同時(shí)使用時(shí)。若與@ManyToOne或@ManyToMany標(biāo)記同時(shí)使用時(shí),將遵循其他的規(guī)則。 l 默認(rèn)情況下,關(guān)聯(lián)的實(shí)體的主鍵一般是用來做外鍵的。但如果此時(shí)不想主鍵作為外鍵,則需要設(shè)置referencedColumnName屬性。例如,將address表中增加一個(gè)字段“ref_id”,address表的建表SQL變?yōu)橐韵滤尽? 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) ) 此時(shí),通過customer表中的“address_id”字段關(guān)聯(lián)的是address表中的“ref_id”,而“ref_id”并不是address表中的主鍵,則實(shí)體中標(biāo)注如代碼下所示。 @OneToOne @JoinColumn(name = "address_id",referencedColumnName="ref_id") public AddressEO getAddress() { return address; } 屬性referencedColumnName標(biāo)注的是所關(guān)聯(lián)表中的字段名,若不指定則使用的所關(guān)聯(lián)表的主鍵字段名作為外鍵。 l JoinColumn標(biāo)記不僅能夠與@OneToOne使用,也可以@ManyToOne或@ManyToMany標(biāo)記同時(shí)使用,它們所表示的含義不同,這些內(nèi)容將在下文詳細(xì)講述。 |
|
|