ManyToOne單向
測(cè)試add:
先添加為one的一方抛寝,再添加為many的一方度硝,共需要三條sql語句实蔽,
先添加為many的一方卷扮,再添加為one的一方荡澎,共需要五條sql語句,增加了更新語句
所以最佳實(shí)踐:一定要先添加一的一方晤锹,之后再添加多的一方
測(cè)試load:
load加載時(shí):關(guān)聯(lián)對(duì)象的加載也是延遲的摩幔。
測(cè)試cascade=all的用處:
沒有添加cascade=all的時(shí)候:拋出異常。
當(dāng)添加了cascade之后鞭铆,不會(huì)拋出異常或衡。
但是同時(shí)cascade也會(huì)造成一些問題,在刪除的時(shí)候:
上述刪除會(huì)拋出異常衔彻。原因如下:
如果刪除的時(shí)候薇宠,cascade也會(huì)把關(guān)聯(lián)的對(duì)象刪除,但是對(duì)于多對(duì)一的情況來說艰额,刪除一個(gè)也會(huì)把關(guān)聯(lián)的唯一一個(gè)刪除澄港,但是又因?yàn)檫€有其他對(duì)象在關(guān)聯(lián),所以刪除不掉這個(gè)關(guān)聯(lián)對(duì)象柄沮,導(dǎo)致這個(gè)對(duì)象也刪除不掉回梧,拋出異常废岂,造成災(zāi)難。
所以沒有特殊情況狱意,不要使用cascade湖苞。
一般使用cascade的地方都是一One的地方進(jìn)行刪除時(shí)使用,特殊情況才使用cascade的add,正常情況add都是由程序員完成添加的
多Many的地方不建議使用cascade.
OneToMany單向
One:
Many
映射文件:
測(cè)試add:
load測(cè)試:
注意:使用lazy="extra"會(huì)稍微智能,會(huì)根據(jù)取值的不同來判斷是調(diào)用count還是投影
特別注意oneToMany在添加和維護(hù)關(guān)系的時(shí)候比較麻煩详囤,所以在開發(fā)中不建議使用oneToMany的單向财骨。
ManyToOne雙向
實(shí)體類
映射文件:
測(cè)試add
使用一的一端來維護(hù)關(guān)系:
結(jié)論:此處會(huì)生成五條sql語句,所以最佳實(shí)踐是藏姐,先添加一的一方隆箩,再添加多的一方,不要使用一的一方來維護(hù)關(guān)系.
實(shí)施方法:在配置文件的set中可以通過設(shè)置inverse=true來明確不使用一的這一端來維護(hù)關(guān)系
使用inverse=true的時(shí)候會(huì)生成三條sql語句羔杨,因?yàn)椴粫?huì)應(yīng)為cr的增加而去更新student的表捌臊。
不去維護(hù)關(guān)系,自然就少了兩條sql語句,但是同時(shí)由于在一的一端來添加兜材,又inverse=true理澎,所以會(huì)造成關(guān)聯(lián)失敗。這就需要程序員自己主動(dòng)使用多的一方來維護(hù)關(guān)系曙寡。
使用多的一端來維護(hù)關(guān)系:
測(cè)試load:
因?yàn)橛嘘P(guān)聯(lián)關(guān)系的存在都可以取出來數(shù)據(jù)糠爬。