一對(duì)一(@OneToOne)
· 單向關(guān)聯(lián)
# 注釋@OneToOne定義如下:
@Target({METHOD, FIELD}) @Retention(RUNTIME)
public @interface OneToOne {
Class targetEntity() default void.class;
CascadeType[] cascade() default {};
FetchType fetch() default EAGER;
boolean optional() default true;
String mappedBy() default "";
}
# targetEntity屬性表示默認(rèn)關(guān)聯(lián)的實(shí)體類型,默認(rèn)為當(dāng)前標(biāo)注的實(shí)體類;
# cascade屬性表示與此實(shí)體一對(duì)一關(guān)聯(lián)的實(shí)體的聯(lián)級(jí)樣式類型。聯(lián)級(jí)樣式上當(dāng)對(duì)實(shí)體進(jìn)行操作時(shí)的策略。
說明:在定義關(guān)系時(shí)經(jīng)常會(huì)涉及是否定義Cascade(級(jí)聯(lián)處理)屬性瓢省,擔(dān)心造成負(fù)面影響.
·不定義,則對(duì)關(guān)系表不會(huì)產(chǎn)生任何影響
·CascadeType.PERSIST (級(jí)聯(lián)新建)
·CascadeType.REMOVE (級(jí)聯(lián)刪除)
·CascadeType.REFRESH (級(jí)聯(lián)刷新)
·CascadeType.MERGE (級(jí)聯(lián)更新)中選擇一個(gè)或多個(gè)。
·還有一個(gè)選擇是使用CascadeType.ALL ,表示選擇全部四項(xiàng)
# fetch屬性是該實(shí)體的加載方式椰于,有兩種:LAZY和EAGER。
# optional屬性表示關(guān)聯(lián)的實(shí)體是否能夠存在null值仪搔。默認(rèn)為true瘾婿,表示可以存在null值。如果為false烤咧,則要同時(shí)配合使用@JoinColumn標(biāo)記偏陪。
# mappedBy屬性用于雙向關(guān)聯(lián)實(shí)體時(shí),標(biāo)注在不保存關(guān)系的實(shí)體中煮嫌。
關(guān)聯(lián)指定列(@JoinColumn)
# @JoinColumn用于注釋表中的字段笛谦,與@Column不同的是它要保存表與表之間關(guān)系的字段;
# name屬性是用來標(biāo)記表中對(duì)應(yīng)的字段的名稱昌阿。如果不設(shè)置name的值饥脑,默認(rèn)情況下,name的取值規(guī)則如下:
name=關(guān)聯(lián)的表的名稱 + "_" + 關(guān)聯(lián)表主鍵的字段名
# 默認(rèn)情況下宝泵,關(guān)聯(lián)的實(shí)體的主鍵一般用來做外鍵的好啰。如果不想用主鍵作為外鍵,則需要設(shè)置referencedColumnName屬性儿奶,如:
@JoinColumn(name="address_id", referencedColumnName="ref_id")
# @JoinColumn可以與@OneToOne框往、@ManyToOne或@ManyToMany標(biāo)記同時(shí)使用。
一對(duì)一單向關(guān)聯(lián)示例:
·客戶實(shí)體類CustomerEO:
@Entity
@Table(name="customer")
public class CustomerEO implement Serializable{
@Id
@GeneratedValue(stragegy=GenerationType=AUTO)
private int id;
@OneToOne(casade={CascadeTypeType.ALL})
@JoinColumn(name="address_id")
private AddressEO address;
....
}
·地址薄類AddressEO:
@Entity
@Table(name="address")
public class AddressEO implement Serializable{
@Id
@GeneratedValue(stragegy=GenerationType=AUTO)
private int id;
....
}
· 雙向關(guān)聯(lián)(Bidirectional)
如上述示例中闯捎,將AddressEO修改如下:
·地址薄類AddressEO:
@Entity
@Table(name="address")
public class AddressEO implement Serializable{
@Id
@GeneratedValue(stragegy=GenerationType=AUTO)
private int id;
@OneToOne(mappedBy="address")
privatre CustomerEO customer;
....
}
即可椰弊。
* 以上所有示例及關(guān)系中表結(jié)構(gòu)如下:
TABLE customer(id int, name varcher,address_id int, PRIMARY KEY id)
TABLE address(id int, address_name varcher, zipcode varcher, city varcher, PRIMARY KEY id)
· 主鍵關(guān)聯(lián)(@PrimaryKeyJoinColumn)
# 在關(guān)聯(lián)的兩個(gè)實(shí)體中直接使用@PrimaryKeyJoinColumn注釋;
# 在上述表結(jié)構(gòu)中需要在customer表中去掉address_id字段瓤鼻;
示例:
·客戶實(shí)體類CustomerEO:
@Entity
@Table(name="customer")
public class CustomerEO implement Serializable{
@Id
@GeneratedValue(stragegy=GenerationType=AUTO)
private int id;
@OneToOne(casade={CascadeTypeType.ALL})
@PrimaryKeyJoinColumn
private AddressEO address;
....
}
·地址薄類AddressEO:
@Entity
@Table(name="address")
public class AddressEO implement Serializable{
@Id
@GeneratedValue(stragegy=GenerationType=AUTO)
private int id;
@PrimaryKeyJoinColumn
privatre CustomerEO customer;
....
}
·默認(rèn)關(guān)聯(lián)
如果表中使用了外鍵秉版,則在映射實(shí)體中不需要做其他的設(shè)置。
@Entity
@Table(name="customer")
public class CustomerEO implement Serializable{
@Id
@GeneratedValue(stragegy=GenerationType=AUTO)
private int id;
@OneToOne
private AddressEO address;
....
}
一對(duì)一映射的步驟:
1. 確定實(shí)體間關(guān)系茬祷;
2. 考慮表結(jié)構(gòu)清焕;
3. 考慮實(shí)體關(guān)系的方向性;
若為雙向關(guān)聯(lián),則在保存實(shí)體關(guān)系的實(shí)體中秸妥,要配合@JoinColumn注釋滚停;在沒有保存實(shí)體關(guān)系的實(shí)體中,要用mappedBy屬性明確所關(guān)聯(lián)的實(shí)體粥惧。