當(dāng)fetch=select的時(shí)候,我們查詢從表數(shù)據(jù)的時(shí)候,首先會(huì)根據(jù)主表查出主表對(duì)象,然后根據(jù)主表id生成另一個(gè)select語(yǔ)句去查詢從表數(shù)據(jù),產(chǎn)生1+N的查詢效果。
當(dāng)fetch=join的時(shí)候,會(huì)根據(jù)一條外連接語(yǔ)句同時(shí)查詢主表和從表數(shù)據(jù)。
但是fetch只適用于get/load或creteria方式進(jìn)行的查詢
當(dāng)outer-join=true時(shí),你的lazy屬性無(wú)論設(shè)置為任何值,Collection都會(huì)初始加載(one-to-one沒(méi)有l(wèi)azy 因此不必考慮^_^)
hibernate中constrained只能在one-to-one的映射中使用,(一般在主表的映射中,有外鍵的那個(gè)表)。如果constrained=true,則表明存在外鍵與關(guān)聯(lián)表對(duì)應(yīng),并且關(guān)聯(lián)表中肯定存在對(duì)應(yīng)的鍵與其對(duì)應(yīng), 另外該選項(xiàng)最關(guān)鍵的是影響save和delete的先后順序。例如增加的時(shí)候,如果constainted=true,則會(huì)先增加關(guān)聯(lián)表,然后增加本表。刪除的時(shí)候反之
one-to-one的單向關(guān)聯(lián)中,如果constrained=false,則會(huì)在查詢時(shí)就全部取出來(lái),用left outer join的方式。如果constrained=true,hibernate即會(huì)延遲加載sql,只把主表的查出來(lái),等有用到關(guān)聯(lián)表的再發(fā)sql取。
one-to-one的雙向關(guān)聯(lián)中,必須設(shè)置constrained=true,要不然會(huì)有重復(fù)數(shù)據(jù)讀,如2個(gè)表user,car;在位false時(shí)sql如下:select * from user a left outer join car b on a.id=b.id left outer join on user c on a.id=c.id where a.id=? 刪除的時(shí)候最好刪除從表,刪除主表會(huì)先查詢下主表,在聯(lián)合查詢下