Hibernate的游離狀態(tài)
Java應用程序與Hibernate之間的主要運行時接口。它是抽象了持久化服務概念的核心抽象API類。
Session的生命周期綁定在一個物理的事務(tansaction)上面。(長的事務可能跨越多個數(shù)據(jù)庫事物。)
Session的主要功能是提供對映射的實體類實例的創(chuàng)建,讀取和刪除操作。
實例可能以下面三種狀態(tài)存在:
◆自由狀態(tài)(transient): 不曾進行持久化,未與任何Session相關聯(lián)
◆持久化狀態(tài)(persistent): 僅與一個Session相關聯(lián)
◆游離狀態(tài)(detached): 已經(jīng)進行過持久化,但當前未與任何Session相關聯(lián)
游離狀態(tài)的實例可以通過調(diào)用update(),lock(),replicate(),save(),persist()或者saveOrUpdate()方法進行持久化。持久化實例可以通過調(diào)用 delete()變成游離狀態(tài)。通過get()或load()方法得到的實例都是持久化狀態(tài)的。游離或者自由狀態(tài)下的實例可以通過調(diào)用merge()方法成為一個新的持久化實例。
save()和persist()將會引發(fā)SQL的INSERT,delete()會引發(fā)SQLDELETE,而update()或merge()會引發(fā)SQLUPDATE。對持久化(persistent)實例的修改在刷新提交的時候會被檢測到,它也會引起SQLUPDATE。saveOrUpdate()或者replicate()會引發(fā)SQLINSERT或者UPDATE。
其具體實現(xiàn)并不一定是線程安全的。每個線程/事務應該從一個SessionFactory獲取自己的session實例。
如果其持久化對象類是可序列化的,則Session實例也是可序列化的。
一個典型的事務應該使用下面的形式:Session sess = factory.openSession();
- Transaction tx;
- try {
- tx = sess.beginTransaction();
- //do some work
- ...
- tx.commit();
- }
- catch (Exception e) {
- if (tx!=null) tx.rollback();
- throw e;
- }
- finally {
- sess.close();
- }
如果Session拋出了異常, 事務必須回滾而session會被廢棄。在異常發(fā)生后Session的內(nèi)部狀態(tài)可能會與數(shù)據(jù)庫失去同步
【編輯推薦】