關於Hibernate裏面session的crud方法解析

1.

SessionFactory這個是工廠類,生產session的,就相當於JDBC裏面的DriveMannager,

 

第一種獲取Session的方法

Session session = SessionFactory.openSession();

session就是用來數據庫crud的,也就是update,delete,select,insert的,

相當於JDBC的statement,prearatement,

用openSession()獲取session,是每次調用這個方法的時候獲取一個新的session

 

第二種獲取Session的方法

Session session =SessionFactory.getCurrentSession();

它獲取的session是通過上下文, session有個Context方法用來管理session的

獲取session後放入線程池進行管理,也就是說Session達到了共享

 

什麼時候用openSession() 什麼時候用getCurrentSession()????

最主要的是我們在用事務的時候儘量用getCurrentSession

它可以保持數據的完整性,避免不必要的錯誤,

比如你修改一張表的同時,另外一個人在插入,此時如果你用openSession的話,

如果你修改一張表失敗,另外一個人有插入成功,而數據庫是原子性的,

事務性的特點是,要麼全部成功,要麼全部失敗.

顯然這裏用OpenSession()是不正確的,

getCrueetSession()爲什麼可以達到數據庫的原子性呢?

原因是它是線程安全的.他們共用一個session,一個session的事務肯定是同步的

 

 

他們兩者還有個區別,當在查詢的時候要用openSession(),如果用getCurrentSession()就會出異常。

 

 

 

 

我們來淺談下Session的幾個常用方法:

當我們對錶進行插入數據,修改數據,刪除數據的時候

一定要開啓事務,和提交事務,及回滾事務,

這樣Hibernate才能把數據對象與表映射起來,不然也只能是在內存中做了修改

一旦連接斷開,數據就消失,而數據庫裏面數據沒有任何變化

 

但是進行查數據的時候就不用擔心了

 

 

1.load方法和get方法

load(Class,id)通過對象和id來查找相應的數據,返回該數據對應的實體類對象

load和get方法很相似都是進行數據庫的查找,

但是load()方法是懶加載,它不是直接進行sql語句查詢,而是去緩衝區中查詢,如果緩衝區

中沒有此對象,就會去二級緩存裏面查找,如果沒有,它不會去數據庫中查詢

而是直接返回一個代理類對象,通過這個代理類對象可以查詢到ID,

如果一旦你關閉Session後

是無法查詢到其他數據,如果進行查詢會拋出異常,如果一定要查詢到,就必須初始化這個代理類

用到Hibernate.initialize(object)這樣就可以進行查詢了

但是session不關閉又會有很大的影響,這個解決辦法可以用spring來解決

而get方法是直接進行sql語句查詢的,緩存區中查找不到,直接跑到數據庫中去查找

如果數據庫中查找不到就會返回一個null

 

2.save方法是進行插入操作

session.save(Object obj);插入你實體類的對像。然後運用Hibernate的sql語句進行insert操作

在這裏我強調一點

如果你的對象set了Id是無效的,如果你配置文件中指定了指定的增長方式,就按照指定的進行

如果沒指定,hibernate會自動的增長,從1開始

因爲看Log加載程序是Hibernate有個序列還是觸發的。

當你save方法後。 對象就從瞬態變成持久化,會被保存到session二級緩存中..

在commit之前,你可以再對對象進行set 而最後調用commit的時候,就會以最後set的值來與數據庫對應

commit方法的作用是,把緩存中的數據與數據庫進行同步。

 

3.update, delete,方法

update是進行數據的更新。

update是把數據從遊離狀態編程持久狀態

 

 

delete對數據進行刪除操作

 

delete是把數據從持久狀態編程移除狀態,它還會在session緩存區中,但是

在數據庫中對應的數據沒有了

一旦session緩存消失了。此對象也就沒有太大意義了

 



Session的入門常用方法


(1)Query query = session.createQuery(hql):利用hql查詢語句查詢;

(2)Criteria critera = session.createCriteria(Class clazz);

(3)Transaction tx = session.beginTransaction();     //開始事務;tx.commit()提交事務;

(4)session.close();//關閉Session,此後被session管理的持久化對象變爲脫管狀態;

(5)session.save(Object obj);    //添加

(6)session.update(Object obj);     //更新

(7)session.delete(Object obj);    //刪除

(8)Object obj = session.get(Class clazz,Serialiazble id);    //根據主鍵查找記錄並返回;

(9)Object obj = session.load(Class clazz,Serializable id);    //和get方法效果一樣,但是是懶加載,即在不使用他之前他不會返回對象;






發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章