一對(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í)的策略,。 說(shuō)明:在定義關(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屬性是用來(lái)標(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í)體的主鍵一般用來(lái)做外鍵的。如果不想用主鍵作為外鍵,,則需要設(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")//關(guān)聯(lián)的表為address表,,其主鍵是id private AddressEO address; .... } ·地址薄類AddressEO: @Entity @Table(name="address")//從表 public class AddressEO implement Serializable{ @Id @GeneratedValue(stragegy=GenerationType=AUTO) private int id; ....//在單項(xiàng)關(guān)聯(lián)中,從表對(duì)應(yīng)的類中不需要引用主表類 } ·雙向關(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)//在customer中多了一個(gè)address_id屬性 TABLE address(id int, address_name varcher, zipcode varcher, city varcher, PRIMARY KEY id) · 主鍵關(guān)聯(lián)(@PrimaryKeyJoinColumn)//我無(wú)法形成主鍵關(guān)聯(lián)。 #在關(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í)體。 |
|
來(lái)自: jackeyqing > 《springboot jpa》