【Hibernate框架开发之五】Hibernate对象的三种状态Session常用方法
?1. Hibernate對象的三種狀態:(圖解如下:)
?
如圖所示,Hibernate對象有三種狀態,1.Transient ?2.Persistent 3.Detached;
三種狀態的區別如下:
1. 當對象處于Transient時,只在內存中有一個對象,沒ID,而且在緩存和數據庫中沒有;
2. 當對象處于save之后,內存、緩存都存在,有ID,而且當對象commit后數據庫也存在;
3.當對象處于Detached時,內存、緩存、數據庫都存在,并有ID,只是處于托管狀態;
? 2. Session常用方法:
? ? ? ? 2. 1Session的兩個方法區分:
得到Session的方法有如下兩個:
openSession :每次都是新的Session,并且要手動close
getCurrentSession:從上下文找,如已有那么用已經有的Session,如沒有,創建新的;不需要手動close;
ps.?? 上下文具體指的是hibernate.cfg.xml中的current_session_context_class:
? <property name="current_session_context_class">thread</property>
current_session_context_class有四個值,兩個是常用的:
thread:在線程里找是否有已經存在的Session;(最常用)
jta:主要針對數據庫分布式而用;(處理多個數據庫事務)
? ? ? ? 2.2 ?delete :
delete(Object arg0); 當對象處于Detached后我們就可以使用delete進行刪除其對象;
2.3 ?load :
ss2.load(Class arg0, Serializable arg1); ?返回Object,強制轉換下就OK了。
arg0:指的是你從數據庫取出數據當成arg0類型處理;
arg1:指的是主鍵;
? ? ? ?2.4. get :?
ss2.load(Class arg0, Serializable arg1); 與Load方法一樣可以實現取出數據的功能;
? ? ? ? ? ? ??注意: ?load 和 get的區別!
2.4.1. ?load返回的只是代理對象,只有當你真正使用對象內容的時候才會發出sql語句;而get則會直接從數據庫加載,立刻發出sql語句,不會延遲;
2.4.2. 當使用不存在的數據時,load不會報錯,而get則肯定會報錯;
? ? ? ?2.5 update:
update(Object arg0); 此種情況效率很低,因為默認將所有字段都進行更新;
so, 可以從數據庫中獲取到其對象后,直接set改變需要設置的屬性,然后當session進行commit時,hibernate默認同步數據庫,如發現一致,不會發update的sql語句進行更新,當不一致的時候才會發sql的update的語句,當然此時更新也是全部字段進行更新,效率仍然偏低;
如果需要單獨更新一個字段,方法如下:
? ? ? ? ? 2.5.1:修改注解(不靈活)當不需要更新時進行更新的屬性,使用注解@Column(updatable=false)
updatable默認為true;
? ? ? ? ?2.5.2: 使用xml配置文件的話,可以使用dynamic-update
? ? ? ? ?2.5.3: HQL(EJBQL)?(推薦)
? 2.6 :saveOrUpdate:
saveOrUpdate(Object o); ? 自動選擇save還是update;
? 2.7: clear: ? ?
clear(); 主要用于清除session的緩存;
? 2.8: flush():
flush(); 強制讓緩存內容與數據庫內容做同步,默認當session的commit時才同步;
總結
以上是生活随笔為你收集整理的【Hibernate框架开发之五】Hibernate对象的三种状态Session常用方法的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: linux下bochs启动黑屏解决办法
- 下一篇: 数据库调优(4)