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的作用。
您可能感興趣的文章:
- jsp hibernate的分頁代碼
- struts2+spring+hibernate分頁代碼[比較多]
- hibernate更新數(shù)據(jù)方法小結(jié)
- Hibernate 查詢方式總結(jié)
- hibernate中的增刪改查實(shí)現(xiàn)代碼
- SSH整合中 hibernate托管給Spring得到SessionFactory
- 解決hibernate+mysql寫入數(shù)據(jù)庫亂碼
- 解析使用jdbc,hibernate處理clob/blob字段的詳解
- java Hibernate save()與persist()區(qū)別
- 解決Hibernate4執(zhí)行save()或update()無效問題的方法
相關(guān)文章
JSP中操作數(shù)據(jù)庫的常用SQL標(biāo)簽用法總結(jié)
這篇文章主要介紹了JSP中操作數(shù)據(jù)庫的常用SQL標(biāo)簽用法總結(jié),SQL標(biāo)簽封裝了數(shù)據(jù)庫訪問的通用邏輯,可以簡化數(shù)據(jù)庫操作,需要的朋友可以參考下2016-04-04JSP Spring ApplicationContext的國際化支持
這篇文章主要介紹了JSP Spring ApplicationContext的國際化支持的相關(guān)資料,需要的朋友可以參考下2017-04-04Java輸出系統(tǒng)當(dāng)前的日期(年月日時(shí)分秒毫秒)
當(dāng)前的日期輸出的方法有很多,本文為大家介紹下在java中是如何實(shí)現(xiàn)輸出年月日時(shí)分秒毫秒的,感興趣的朋友不妨參考下2013-09-09JSP實(shí)時(shí)顯示當(dāng)前系統(tǒng)時(shí)間的四種方式示例解析
這篇文章主要介紹了JSP實(shí)時(shí)顯示當(dāng)前系統(tǒng)時(shí)間的四種方式示例解析,文章通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-08-08