/**
* 使用 hql 語句進(jìn)行操作
* @param hql HSQL 查詢語句
* @param offset 開始取數(shù)據(jù)的下標(biāo)
* @param length 讀取數(shù)據(jù)記錄數(shù)
* @return List 結(jié)果集
*/
public List getListForPage ( final String hql , final int offset , final int length ) {
List list = getHibernateTemplate().executeFind ( new HibernateCallback ( ) {
public Object doInHibernate ( Session session ) throws HibernateException, SQLException {
Query query = session.createQuery ( hql ) ;
query.setFirstResult ( offset ) ;
query.setMaxResults ( length ) ;
List list = query.list ( ) ;
return list ;
}
}) ;
return list ;
}
//---------------------------------------------------------------------------
final String queryString = "from Fourm"; //必須定義final類型
List l= getHibernateTemplate().executeFind(new HibernateCallback(){
public Object doInHibernate ( Session session ) throws HibernateException, SQLException {
Query query = session.createQuery ( queryString ) ;
query.setFirstResult ( 0 ) ;
query.setMaxResults ( 10 ) ;
List list = query.list ( ) ;
return list ;
}
//------------------------------------------------------------
為什么不使用getSession(),而使用回調(diào)的詳細(xì)說明:
紫蝶∏飛揚(yáng)↗
聽個(gè)SPRING+HIBERNATE開發(fā)的問題.
SPRING想調(diào)用HIBERNATE的方法有兩種,一種是使用getSession();一種是:HibernateCallback回調(diào).
他們有什么不同?
海綿♂寶寶
前者沒有事務(wù)管控,Spring把Hibernate最原始的Session給你!但是它不被聲明式事務(wù)管理的服務(wù)!
紫蝶∏飛揚(yáng)↗
...聲明式事務(wù)不會對他進(jìn)行事務(wù)管理?
海綿♂寶寶
后者也是把Session返給你,但是通過閉包回調(diào)的形式給你使用,Spring會在給你之前做一下手腳,例如:添加聲明式事務(wù)管理中聲明的事務(wù)屬性!
海綿♂寶寶
因?yàn)槟銓懙姆椒ㄍㄟ^匿名函數(shù)閉包,然后由Spring去負(fù)責(zé)執(zhí)行閉包體內(nèi)的方法!
海綿♂寶寶
Java里的借口回調(diào)基本都是借用匿名內(nèi)部類實(shí)現(xiàn)的閉包!
海綿♂寶寶
你看一下Spring的HibernateDaoSupport的源代碼就知道運(yùn)行過程了!
海綿♂寶寶
直接使用getSession()還不享有Spring提供的模板支持,也就是說你得手動關(guān)閉連接,否則會一直掛在那兒,直到超時(shí)連接池才會回收這個(gè)連接!
海綿♂寶寶
這樣很容器連接池連接數(shù)量溢出!你懂了???
紫蝶∏飛揚(yáng)↗
嗯.
紫蝶∏飛揚(yáng)↗
new HibernateCallback(){
public Object doInHibernate ( Session session ) throws HibernateException, SQLException {
必須這樣的方式嗎?
海綿♂寶寶
建議補(bǔ)習(xí)一下編程中的閉包、回調(diào)的知識,再看看Spring的那段代碼就可以徹底理解了!
海綿♂寶寶
恩!
紫蝶∏飛揚(yáng)↗
哦.明白了.
海綿♂寶寶
如果你覺得getHibernateTemplate()提供的方法不足以滿足你的要求!你就得這么使用!
紫蝶∏飛揚(yáng)↗
明白.不夠用的情況下用回調(diào).
海綿♂寶寶
閉包JavaScript支持的比較好,因?yàn)樗且院瘮?shù)為單元的,Java過于強(qiáng)調(diào)面向?qū)ο螅灾荒苡媚涿麅?nèi)部類來有限的支持閉包!標(biāo)準(zhǔn)的回調(diào)都是方法回調(diào),也就是閉包到方法中,而不是類中!所以Java中的閉包和其他的語言有一些區(qū)別的,例如訪問外部變量必須是final的!
海綿♂寶寶
據(jù)說JDK1.7會加入對函數(shù)閉包調(diào)用的支持!
紫蝶∏飛揚(yáng)↗
...歷害.
紫蝶∏飛揚(yáng)↗
偶只知道這樣用,不知道為什么這樣用.
海綿♂寶寶
那可不行??!呵呵!我最一開始也不大明白,后來仔細(xì)研究了閉包、回調(diào)的知識就懂了!
其實(shí)這種用法在Swing編程里天天都用?。“岩粋€(gè)匿名的監(jiān)聽器實(shí)現(xiàn)類注冊到事件源,只不過那個(gè)時(shí)候沒有注意到這是閉包和回調(diào)罷了!
紫蝶∏飛揚(yáng)↗
看來有時(shí)間得好好看看了...
聯(lián)系客服