最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Hibernate save() saveorupdate()的用法

 更新時(shí)間:2008年11月14日 23:14:19   作者:  
在Hibernate中,最核心的概念就是對(duì)PO的狀態(tài)管理。

此時(shí)問(wèn)題就來(lái)了:上面的代碼運(yùn)行正確有一個(gè)必要的前提,那就是方法調(diào)用參數(shù)cat對(duì)象必須是一個(gè)已經(jīng)被持久化過(guò)的PO,也就是來(lái)說(shuō),它應(yīng)該首先從數(shù)據(jù)庫(kù)查詢出來(lái),然后才能這樣用。但是業(yè)務(wù)層的程序員顯然不知道這種內(nèi)部的玄妙,如果他的業(yè)務(wù)是現(xiàn)在增加一個(gè)cat,然后再增加它的mate,他顯然會(huì)這樣調(diào)用,new一個(gè)cat對(duì)象出來(lái),然后就addMate:
Java代碼
Cat cat = new Cat();;
cat.setXXX();;
daoimpl.addMate(cat,mate);;

Cat cat = new Cat();;
cat.setXXX();;
daoimpl.addMate(cat,mate);;
Cat cat = new Cat();;
cat.setXXX();;
daoimpl.addMate(cat,mate);;
但是請(qǐng)注意看,這個(gè)cat對(duì)象只是一個(gè)VO,它沒(méi)有被持久化過(guò),它還不是PO,它沒(méi)有資格調(diào)用addMate方法,因此調(diào)用addMate方法不會(huì)真正往數(shù)據(jù)庫(kù)里面發(fā)送update的sql,這個(gè)cat對(duì)象必須先被save到數(shù)據(jù)庫(kù),在真正成為一個(gè)PO之后,才具備addMate的資格。
你必須這樣來(lái)操作:
Java代碼
Cat cat = new Cat();;
cat.setXXX();;
daoimpl.addCat(cat);;
daoimpl.addMate(cat, mate);;

Cat cat = new Cat();;
cat.setXXX();;
daoimpl.addCat(cat);;
daoimpl.addMate(cat, mate);;
Cat cat = new Cat();;
cat.setXXX();;
daoimpl.addCat(cat);;
daoimpl.addMate(cat, mate);;
先持久化cat,然后才能對(duì)cat進(jìn)行其他的持久化操作。因此要求業(yè)務(wù)層的程序員必須清楚cat對(duì)象處于何種狀態(tài),到底是第一種,還是第三種。如果是第一種,就要先save,再addMate;如果是第三種,就直接addMate。
但是最致命的是,如果整個(gè)軟件分層很多,業(yè)務(wù)層的程序員他拿到這個(gè)cat對(duì)象也可能是上層Web應(yīng)用層傳遞過(guò)來(lái)的cat,他自己也不知道這個(gè)cat究竟是VO,沒(méi)有被持久化過(guò),還是已經(jīng)被持久化過(guò),那么他根本就沒(méi)有辦法寫程序了。
所以這樣的DAOImpl顯然是有問(wèn)題的,它會(huì)對(duì)業(yè)務(wù)層的程序員造成很多編程上的陷阱,業(yè)務(wù)層的程序員必須深刻的了解他調(diào)用的每個(gè)DAO對(duì)PO對(duì)象進(jìn)行了何種狀態(tài)管理,必須深刻的了解他的PO對(duì)象在任何時(shí)候處于什么確切的狀態(tài),才能保證編程的正確性,顯然這是做不到的,但是有了saveOrUpdate,這些問(wèn)題就迎刃而解了。
現(xiàn)在你需要修改addMate方法:
Java代碼
public void addMate(Cat cat, Mate mate); {
Session session = ...;
Transacton tx = ...;
session.saveOrUpdate(cat);;
cat.addMate(mate);;
tx.commit();;
session.close();;
};

public void addMate(Cat cat, Mate mate); {
Session session = ...;
Transacton tx = ...;
session.saveOrUpdate(cat);;
cat.addMate(mate);;
tx.commit();;
session.close();;
};
public void addMate(Cat cat, Mate mate); {
Session session = ...;
Transacton tx = ...;
session.saveOrUpdate(cat);;
cat.addMate(mate);;
tx.commit();;
session.close();;
};
如上,如果業(yè)務(wù)層的程序員傳進(jìn)來(lái)的是一個(gè)已經(jīng)持久化過(guò)的PO對(duì)象,那么Hibernate會(huì)更新cat對(duì)象(假設(shè)業(yè)務(wù)層的程序員在Session外面修改過(guò)cat的屬性),如果傳進(jìn)來(lái)的是一個(gè)新new出來(lái)的對(duì)象,那么向數(shù)據(jù)庫(kù)save這個(gè)PO對(duì)象。
BTW: Hibernate此時(shí)究竟采取更新cat對(duì)象,還是save cat對(duì)象,取決于unsave-value的設(shè)定。
這樣,業(yè)務(wù)層的程序員就不必再操心PO的狀態(tài)問(wèn)題了,對(duì)于他們來(lái)說(shuō),不管cat是new出來(lái)的對(duì)象,只是一個(gè)VO也好;還是從數(shù)據(jù)庫(kù)查詢出來(lái)的的PO對(duì)象也好,全部都是直接addMate就OK了:
Java代碼
daoimple.addMate(cat, mate);;

daoimple.addMate(cat, mate);;
daoimple.addMate(cat, mate);;
這便是saveOrUpdate的作用。

相關(guān)文章

最新評(píng)論

阳泉市| 吉木萨尔县| 岳西县| 华安县| 鹤壁市| 和平区| 饶河县| 阿克苏市| 琼海市| 礼泉县| 东乡| 容城县| 聂拉木县| 沙坪坝区| 余干县| 德化县| 阜康市| 吴忠市| 延长县| 蒙自县| 湛江市| 东明县| 大足县| 黄龙县| 乐清市| 同心县| 瑞安市| 双桥区| 两当县| 鸡泽县| 乌审旗| 安庆市| 清水县| 长宁区| 南郑县| 潞西市| 十堰市| 南郑县| 类乌齐县| 浦城县| 东乡县|