《我的 O/R Mapping 之旅(二)》,有一段對(duì) People.hbm.xml 的分析,談到為什么使用 inverse=”true”:
在車輛治理系統(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)生歧異,似乎是在說把 AtuoInfo 設(shè)置成“true”了。應(yīng)改為:
在車輛治理系統(tǒng)中,AtuoInfo 作為主控方,應(yīng)該在 People 中設(shè)置 inverse =“true”。
沿著思路往下走,你也許會(huì)問:什么才叫“主動(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 沒有主動(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")
新聞熱點(diǎn)
疑難解答
圖片精選
網(wǎng)友關(guān)注