《我的 O/R Mapping 之旅(二)》,有一段對(duì) People.hbm.xml 的分析,談到為什么使用 inverse=”true”:
紅色標(biāo)識(shí)的句子容易讓人產(chǎn)生歧異,好像是在說(shuō)把 AtuoInfo 設(shè)置成“true”了。應(yīng)改為:
沿著思路往下走,你也許會(huì)問(wèn):什么才叫“主動(dòng)維護(hù)關(guān)系”?不妨看看下面的代碼(摘自《我的 O/R Mapping 之旅(三)》):
這段解釋太絕對(duì)了,事實(shí)上可以直接保存 AutoInfo 對(duì)象,而不用通過(guò)保存 People 來(lái)中轉(zhuǎn):
Hibernate 中,要完成一次操作,可以有多種實(shí)現(xiàn)方式,哪種最好,就要靠自己定奪了。
請(qǐng)注意!引用、轉(zhuǎn)貼本文應(yīng)注明原作者:Rosen Jiang 以及出處:http://www.aygfsteel.com/rosen
在車輛管理系統(tǒng)中,代表著一個(gè)擁有者擁有多臺(tái)車輛。以 java.util.Set 類型表示。 inverse 用于標(biāo)識(shí)雙向關(guān)聯(lián)中的被動(dòng)方一端。inverse=false 的一方(主控方)負(fù)責(zé)維護(hù)關(guān)聯(lián)關(guān)系;在車輛管理系統(tǒng)中, AutoInfo 作為主控方,應(yīng)該把它設(shè)為“true”。這就好比你(被動(dòng)方 one)在某個(gè)聚會(huì)上散發(fā)了許多名片,但是有可能你不清楚接收者(主動(dòng)方 many)的具體背景;這個(gè)不要緊,接收者在必要的時(shí)候會(huì)和你聯(lián)系就是了(主動(dòng)維護(hù)關(guān)系)。 |
紅色標(biāo)識(shí)的句子容易讓人產(chǎn)生歧異,好像是在說(shuō)把 AtuoInfo 設(shè)置成“true”了。應(yīng)改為:
在車輛管理系統(tǒng)中,AtuoInfo 作為主控方,應(yīng)該在 People 中設(shè)置 inverse =“true”。 |
沿著思路往下走,你也許會(huì)問(wèn):什么才叫“主動(dòng)維護(hù)關(guān)系”?不妨看看下面的代碼(摘自《我的 O/R Mapping 之旅(三)》):
AutoInfo ai=new AutoInfo(); People people=new People(); public void DoTest() { try { Configuration cfg = new Configuration().configure(); SessionFactory sessions = cfg.buildSessionFactory(); Session session = sessions.openSession(); Transaction tx = session.beginTransaction(); ai.setLicensePlate("A00001"); ai.setOwnerNo(people); people.setAddress("中國(guó)"); people.setName("張三"); people.addToAutoInfoSet(ai); session.save(people); tx.commit(); session.close(); } catch (Exception e) { System.out.println(e); } } |
把“ai.setOwnerNo(people)”注解了試試,由于 AutoInfo 沒(méi)有主動(dòng)維護(hù)關(guān)系,導(dǎo)致 AUTO_INFO 表中 OWNER_NO 字段為“Null”。自然 AutoInfo 與 Poople 就不存在任何聯(lián)系了。
人類的求知欲很強(qiáng)烈!
為什么非要用 AutoInfo 作為主控方?People 作主控方不行?好吧,為 People.hbm.xml 刪除inverse=”true”,再運(yùn)行以上程序,其實(shí)也能保存,只是多了一條SQL:“update auto_info set OWNER_NO=? where AUTO_ID=?”,這就是 AutoInfo 被動(dòng)地修改和 People 的聯(lián)系。多執(zhí)行一次 SQL 意味著多了一些開銷,這是對(duì)性能不利的!
《我的 O/R Mapping 之旅(三)》,有一段對(duì)張三第二次買車的程序和描述:
AutoInfo ai = new AutoInfo(); People people = new People(); public void DoTest() { try { Configuration cfg = new Configuration().configure(); SessionFactory sessions = cfg.buildSessionFactory(); Session session = sessions.openSession(); Transaction tx = session.beginTransaction(); people = (People) session .find( "from People where OWNER_ID=1") .get(0); ai.setLicensePlate("A00002"); ai.setOwnerNo(people); people.getAutoInfoSet().add(ai); session.save(people); tx.commit(); session.close(); } catch (Exception e) { System.out.println(e); } } |
到這里,也許你會(huì)有這樣的想法:“應(yīng)該可以直接向 AUTO_INFO 表插入記錄,不通過(guò) People 對(duì)象中轉(zhuǎn),像寫 SQL 一樣 Easy。” 錯(cuò)了!以前直接寫 SQL 是可以辦到的,不過(guò)現(xiàn)在我們用的可是 Hibernate ,一切都要以對(duì)象行事,看見 ai.setOwnerNo(people) 了嗎?傳入?yún)?shù)是個(gè) People 對(duì)象實(shí)例,不是簡(jiǎn)單的字段喔。 |
這段解釋太絕對(duì)了,事實(shí)上可以直接保存 AutoInfo 對(duì)象,而不用通過(guò)保存 People 來(lái)中轉(zhuǎn):
AutoInfo ai = new AutoInfo(); People people = new People(); public void DoTest() { try { Configuration cfg = new Configuration().configure(); SessionFactory sessions = cfg.buildSessionFactory(); Session session = sessions.openSession(); Transaction tx = session.beginTransaction(); people = (People) session .find( "from People where OWNER_ID=1") .get(0); ai.setLicensePlate("A00002"); ai.setOwnerNo(people); session.save(ai); tx.commit(); session.close(); } catch (Exception e) { System.out.println(e); } } |
《我的 O/R Mapping 之旅(四)》,刪除 PEOPLE 表及其關(guān)聯(lián)的 AUTO_INFO 表時(shí),程序是沒(méi)有錯(cuò),不過(guò)有更簡(jiǎn)單的辦法來(lái)刪除:
try { Configuration cfg = new Configuration().configure(); SessionFactory sessions = cfg.buildSessionFactory(); Session session = sessions.openSession(); Transaction tx = session.beginTransaction(); session.delete("from People where OWNER_ID=1"); tx.commit(); session.close(); } catch (Exception e) { System.out.println(e); } |
Hibernate 中,要完成一次操作,可以有多種實(shí)現(xiàn)方式,哪種最好,就要靠自己定奪了。
請(qǐng)注意!引用、轉(zhuǎn)貼本文應(yīng)注明原作者:Rosen Jiang 以及出處:http://www.aygfsteel.com/rosen