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