在項目開發中,使用了ssh架構內建時,多處都會用到session。在對session的使用維護上,有如下幾種看法:
1.getcurrentsession();
獲得目前會話中的session,該session有容器自行維護管理,spring可以代理事務。
2.this.getsession();
從目前的執行中獲得或建立一個hibernate的session對象,需要自己手動關閉,以釋放連接配接資源。
3.opensession();
調用函數自行建立一個資料庫的連接配接,并将其打開,在使用spring操作非查詢語句的請況下,spring的事務對該session對象不起到事務管理的作用,是以該session對象應當由程式員自己關閉,釋放連接配接資源。
以上三種操作session的方式,我們都離不開這樣的操作主線:
打開session,開始一個事務,處理異常,送出一個事務,最後關閉一個session。
如果我們自己隻專注于業務,不想去作這些重複而繁瑣的操作,那這樣的一套操作對我們來講太繁瑣了!
相信任何一個程式員,都不想重複敲着那一遍又一遍雷同的代碼!
在spring的架構中,hibernatetemplate包裝了hibernate的代碼,提供了相當多有用的輔助功能。spring的hibernatetemplate可以幫我們完成這樣的工作,使用聲明式的配置來實作這樣的功能。既然使用了ssh內建,那就要充分利用好spring的這個功能吧,當然如果你還擔心spring到底有沒有關閉session的話,不妨看看這個文章:【那個看起來有點2但不2的程式員做的一件事:驗證hibernatetemplate有沒有關閉session:http://songzj.iteye.com/blog/766148】
但是如果我們非得使用session來完成業務而又不想去管事務上的事,那就意味着我們放棄了上面所說的一切好處!
spring,她依然可以幫我們完成這種有點bt的需求。
hibernatetemplate提供hibernatecallback,就是為了滿足這種使用了hibernatetemplate的情況下,仍然需要直接通路session的需求而來的。它提供了在hibernatetemplate裡面直接通路session的能力,程式員不必人為的管理session對象(這個就是使用hibernatecallback的原因http://blog.163.com/yeyhan/blog/static/44179333201022942856795/)。
首先,應該確定我們的dao已經繼承了hibernatedaosupport。
于是,如果我們可以參考如下形式書寫:
@suppresswarnings("unchecked")
public page querydata(final string countsql,
final string resultsql,
final
int startindex, final
int pagesize, final
long total) {
page result = (page) gethibernatetemplate().execute(
new hibernatecallback() {
public object doinhibernate(session session)
throws hibernateexception, sqlexception {
long totalcount =
0;
if (total <
0) {
list countlist = session.createsqlquery(countsql)
.list();
totalcount += long.parselong(countlist.get(0)
.tostring());
} else {
totalcount = total;
}
if (totalcount <
1) {
return
new page();
// 實際查詢傳回分頁對象
query query = session
.createsqlquery(resultsql)
.addscalar("carlsh", hibernate.integer)
.addscalar("carpic", hibernate.string)
.addscalar("carinfo", hibernate.string)
.addscalar("carcolor", hibernate.string)
.addscalar("cartype", hibernate.string)
.setresulttransformer(
transformers.aliastobean(carinfo.class));
if (pagesize >
if (startindex <
query.setfirstresult(0);
} else
if (startindex >= totalcount) {
return
} else {
query.setfirstresult(startindex);
}
if (startindex + pagesize > totalcount) {
query.setmaxresults((int) totalcount
- startindex);
query.setmaxresults(pagesize);
return
new page(startindex, totalcount, pagesize, query
.list());
}
});
return result;
}