亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

Hibernate save() saveorupdate()的用法

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

此時問題就來了:上面的代碼運(yùn)行正確有一個必要的前提,那就是方法調(diào)用參數(shù)cat對象必須是一個已經(jīng)被持久化過的PO,也就是來說,它應(yīng)該首先從數(shù)據(jù)庫查詢出來,然后才能這樣用。但是業(yè)務(wù)層的程序員顯然不知道這種內(nèi)部的玄妙,如果他的業(yè)務(wù)是現(xiàn)在增加一個cat,然后再增加它的mate,他顯然會這樣調(diào)用,new一個cat對象出來,然后就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);;
但是請注意看,這個cat對象只是一個VO,它沒有被持久化過,它還不是PO,它沒有資格調(diào)用addMate方法,因此調(diào)用addMate方法不會真正往數(shù)據(jù)庫里面發(fā)送update的sql,這個cat對象必須先被save到數(shù)據(jù)庫,在真正成為一個PO之后,才具備addMate的資格。
你必須這樣來操作:
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,然后才能對cat進(jìn)行其他的持久化操作。因此要求業(yè)務(wù)層的程序員必須清楚cat對象處于何種狀態(tài),到底是第一種,還是第三種。如果是第一種,就要先save,再addMate;如果是第三種,就直接addMate。
但是最致命的是,如果整個軟件分層很多,業(yè)務(wù)層的程序員他拿到這個cat對象也可能是上層Web應(yīng)用層傳遞過來的cat,他自己也不知道這個cat究竟是VO,沒有被持久化過,還是已經(jīng)被持久化過,那么他根本就沒有辦法寫程序了。
所以這樣的DAOImpl顯然是有問題的,它會對業(yè)務(wù)層的程序員造成很多編程上的陷阱,業(yè)務(wù)層的程序員必須深刻的了解他調(diào)用的每個DAO對PO對象進(jìn)行了何種狀態(tài)管理,必須深刻的了解他的PO對象在任何時候處于什么確切的狀態(tài),才能保證編程的正確性,顯然這是做不到的,但是有了saveOrUpdate,這些問題就迎刃而解了。
現(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)來的是一個已經(jīng)持久化過的PO對象,那么Hibernate會更新cat對象(假設(shè)業(yè)務(wù)層的程序員在Session外面修改過cat的屬性),如果傳進(jìn)來的是一個新new出來的對象,那么向數(shù)據(jù)庫save這個PO對象。
BTW: Hibernate此時究竟采取更新cat對象,還是save cat對象,取決于unsave-value的設(shè)定。
這樣,業(yè)務(wù)層的程序員就不必再操心PO的狀態(tài)問題了,對于他們來說,不管cat是new出來的對象,只是一個VO也好;還是從數(shù)據(jù)庫查詢出來的的PO對象也好,全部都是直接addMate就OK了:
Java代碼
daoimple.addMate(cat, mate);;

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

相關(guān)文章

最新評論