Hibernate 會話

2021-02-24 15:06 更新

會話

Session 用于獲取與數(shù)據(jù)庫的物理連接。 Session 對象是輕量級的,并且設(shè)計為在每次需要與數(shù)據(jù)庫進行交互時被實例化。持久態(tài)對象被保存,并通過 Session 對象檢索找回。

該 Session 對象不應(yīng)該長時間保持開放狀態(tài),因為它們通常不能保證線程安全,而應(yīng)該根據(jù)需求被創(chuàng)建和銷毀。Session 的主要功能是為映射實體類的實例提供創(chuàng)建,讀取和刪除操作。這些實例可能在給定時間點時存在于以下三種狀態(tài)之一:

  • 瞬時狀態(tài): 一種新的持久性實例,被 Hibernate 認(rèn)為是瞬時的,它不與 Session 相關(guān)聯(lián),在數(shù)據(jù)庫中沒有與之關(guān)聯(lián)的記錄且無標(biāo)識符值。
  • 持久狀態(tài):可以將一個瞬時狀態(tài)實例通過與一個 Session 關(guān)聯(lián)的方式將其轉(zhuǎn)化為持久狀態(tài)實例。持久狀態(tài)實例在數(shù)據(jù)庫中沒有與之關(guān)聯(lián)的記錄,有標(biāo)識符值,并與一個 Session 關(guān)聯(lián)。
  • 脫管狀態(tài):一旦關(guān)閉 Hibernate Session,持久狀態(tài)實例將會成為脫管狀態(tài)實例。

若 Session 實例的持久態(tài)類別是序列化的,則該 Session 實例是序列化的。一個典型的事務(wù)應(yīng)該使用以下語法:

Session session = factory.openSession();
Transaction tx = null;
try {
   tx = session.beginTransaction();
   // do some work
   ...
   tx.commit();
}
catch (Exception e) {
   if (tx!=null) tx.rollback();
   e.printStackTrace(); 
}finally {
   session.close();
}

如果 Session 引發(fā)異常,則事務(wù)必須被回滾,該 session 必須被丟棄。

Session 接口方法

Session 接口提供了很多方法,但在以下講解中我將僅列出幾個我們會在本教程中應(yīng)用的重要方法。您可以查看 Hibernate 文件,查詢與 SessionSessionFactory 相關(guān)的完整方法目錄。

序號 Session 方法及說明
1 Transaction beginTransaction()
開始工作單位,并返回關(guān)聯(lián)事務(wù)對象。
2 void cancelQuery()
取消當(dāng)前的查詢執(zhí)行。
3 void clear()
完全清除該會話。
4 Connection close()
通過釋放和清理 JDBC 連接以結(jié)束該會話。
5 Criteria createCriteria(Class persistentClass)
為給定的實體類或?qū)嶓w類的超類創(chuàng)建一個新的 Criteria 實例。
6 Criteria createCriteria(String entityName)
為給定的實體名稱創(chuàng)建一個新的 Criteria 實例。
7 Serializable getIdentifier(Object object)
返回與給定實體相關(guān)聯(lián)的會話的標(biāo)識符值。
8 Query createFilter(Object collection, String queryString)
為給定的集合和過濾字符創(chuàng)建查詢的新實例。
9 Query createQuery(String queryString)
為給定的 HQL 查詢字符創(chuàng)建查詢的新實例。
10 SQLQuery createSQLQuery(String queryString)
為給定的 SQL 查詢字符串創(chuàng)建 SQLQuery 的新實例。
11 void delete(Object object)
從數(shù)據(jù)存儲中刪除持久化實例。
12 void delete(String entityName, Object object)
從數(shù)據(jù)存儲中刪除持久化實例。
13 Session get(String entityName, Serializable id)
返回給定命名的且?guī)в薪o定標(biāo)識符或 null 的持久化實例(若無該種持久化實例)。
14 SessionFactory getSessionFactory()
獲取創(chuàng)建該會話的 session 工廠。
15 void refresh(Object object)
從基本數(shù)據(jù)庫中重新讀取給定實例的狀態(tài)。
16 Transaction getTransaction()
獲取與該 session 關(guān)聯(lián)的事務(wù)實例。
17 boolean isConnected()
檢查當(dāng)前 session 是否連接。
18 boolean isDirty()
該 session 中是否包含必須與數(shù)據(jù)庫同步的變化?
19 boolean isOpen()
檢查該 session 是否仍處于開啟狀態(tài)。
20 Serializable save(Object object)
先分配一個生成的標(biāo)識,以保持給定的瞬時狀態(tài)實例。
21 void saveOrUpdate(Object object)
保存(對象)或更新(對象)給定的實例。
22 void update(Object object)
更新帶有標(biāo)識符且是給定的處于脫管狀態(tài)的實例的持久化實例。
23 void update(String entityName, Object object)
更新帶有標(biāo)識符且是給定的處于脫管狀態(tài)的實例的持久化實例。
以上內(nèi)容是否對您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號
微信公眾號

編程獅公眾號