欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Hibernate save() saveorupdate()的用法

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

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

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

相關(guān)文章

最新評(píng)論