Hibernate save() saveorupdate()的用法
更新時間:2008年11月14日 23:14:19 作者:
在Hibernate中,最核心的概念就是對PO的狀態(tài)管理。
此時問題就來了:上面的代碼運行正確有一個必要的前提,那就是方法調用參數cat對象必須是一個已經被持久化過的PO,也就是來說,它應該首先從數據庫查詢出來,然后才能這樣用。但是業(yè)務層的程序員顯然不知道這種內部的玄妙,如果他的業(yè)務是現在增加一個cat,然后再增加它的mate,他顯然會這樣調用,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,它沒有資格調用addMate方法,因此調用addMate方法不會真正往數據庫里面發(fā)送update的sql,這個cat對象必須先被save到數據庫,在真正成為一個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進行其他的持久化操作。因此要求業(yè)務層的程序員必須清楚cat對象處于何種狀態(tài),到底是第一種,還是第三種。如果是第一種,就要先save,再addMate;如果是第三種,就直接addMate。
但是最致命的是,如果整個軟件分層很多,業(yè)務層的程序員他拿到這個cat對象也可能是上層Web應用層傳遞過來的cat,他自己也不知道這個cat究竟是VO,沒有被持久化過,還是已經被持久化過,那么他根本就沒有辦法寫程序了。
所以這樣的DAOImpl顯然是有問題的,它會對業(yè)務層的程序員造成很多編程上的陷阱,業(yè)務層的程序員必須深刻的了解他調用的每個DAO對PO對象進行了何種狀態(tài)管理,必須深刻的了解他的PO對象在任何時候處于什么確切的狀態(tài),才能保證編程的正確性,顯然這是做不到的,但是有了saveOrUpdate,這些問題就迎刃而解了。
現在你需要修改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è)務層的程序員傳進來的是一個已經持久化過的PO對象,那么Hibernate會更新cat對象(假設業(yè)務層的程序員在Session外面修改過cat的屬性),如果傳進來的是一個新new出來的對象,那么向數據庫save這個PO對象。
BTW: Hibernate此時究竟采取更新cat對象,還是save cat對象,取決于unsave-value的設定。
這樣,業(yè)務層的程序員就不必再操心PO的狀態(tài)問題了,對于他們來說,不管cat是new出來的對象,只是一個VO也好;還是從數據庫查詢出來的的PO對象也好,全部都是直接addMate就OK了:
Java代碼
daoimple.addMate(cat, mate);;
daoimple.addMate(cat, mate);;
daoimple.addMate(cat, mate);;
這便是saveOrUpdate的作用。
相關文章
Struts1之url截取_動力節(jié)點Java學院整理
這篇文章主要介紹了Struts1之url截取_動力節(jié)點Java學院整理的相關資料,需要的朋友可以參考下2017-09-09

