《我的 O/R Mapping 之旅(二)》,有一段對 People.hbm.xml 的分析,談到為什么使用 inverse=”true”:
在車輛治理系統中,代表著一個擁有者擁有多臺車輛。以 java.util.Set 類型表示。 inverse 用于標識雙向關聯中的被動方一端。inverse=false 的一方(主控方)負責維護關聯關系;在車輛治理系統中, AutoInfo 作為主控方,應該把它設為“true”。這就好比你(被動方 one)在某個聚會上散發了許多名片,但是有可能你不清楚接收者(主動方 many)的具體背景;這個不要緊,接收者在必要的時候會和你聯系就是了(主動維護關系)。
紅色標識的句子輕易讓人產生歧異,似乎是在說把 AtuoInfo 設置成“true”了。應改為:
在車輛治理系統中,AtuoInfo 作為主控方,應該在 People 中設置 inverse =“true”。
沿著思路往下走,你也許會問:什么才叫“主動維護關系”?不妨看看下面的代碼(摘自《我的 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("中國");
people.setName("張三");
people.addToAutoInfoSet(ai);
session.save(people);
tx.commit();
session.close();
} catch (Exception e) {
System.out.PRintln(e);
}
}
把“ai.setOwnerNo(people)”注解了試試,由于 AutoInfo 沒有主動維護關系,導致 AUTO_INFO 表中 OWNER_NO 字段為“Null”。自然 AutoInfo 與 Poople 就不存在任何聯系了。
人類的求知欲很強烈!
為什么非要用 AutoInfo 作為主控方?People 作主控方不行?好吧,為 People.hbm.xml 刪除inverse=”true”,再運行以上程序,其實也能保存,只是多了一條SQL:“update auto_info set OWNER_NO=? where AUTO_ID=?”,這就是 AutoInfo 被動地修改和 People 的聯系。多執行一次 SQL 意味著多了一些開銷,這是對性能不利的!
《我的 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();
people =
(People) session
.find(
"from People where OWNER_ID=1")
新聞熱點
疑難解答