我無法理解使用Hibernate回調方法的優點,是否有任何優勢或具體用例我們應該去做。使用Hibernate回調的優點?
public List findRecentRequests(final int offset, final int length)
{
List list = getHibernateTemplate().executeFind(new HibernateCallback()
{
public Object doInHibernate(Session session) throws HibernateException
{
Query q = session.createQuery(FIND_RECENT_REQUESTS);
q.setFirstResult(offset);
q.setMaxResults(length);
return q.list();
}
});
return list;
}
另外一個更重要的問題是,HibernateCallback方法在查詢返回值後每次關閉會話嗎?我有使用情況,每次刷新狀態頁面時都會多次調用此函數,每次打開會話和查詢數據庫時都會調用該函數,或者將查詢結果存儲在內存中,然後每次調用此函數時都會彈出結果從記憶裏。
我已閱讀(Reference):
彈簧HibernateTemplate.execute()默認完成後,關閉所有打開的會話。當延遲初始化使用可能會得到像下面這樣
org.hibernate.LazyInitializationException LazyInitializationException中:無法初始化代理 - 沒有會話
相關文檔部分的任何引用將高度讚賞。
更新:
在我的情況下,使用EJB事務和將其設置爲「支持」,我相信在爲交易設置爲支持這種情況下,它是可選的,所以每次新的會話將被創建我和hibernate會查詢數據庫以獲得結果,所以這就是瓶頸,這是否是一個正確的假設?
您應該在您打開會話的數據訪問層返回之前初始化懶惰集合。或者使用'OpenSessionInViewFilter' – millimoose
@Inddial:如果你能用一個例子來詳細說明,我會非常感激。 – Rachel
Hibernate文檔已經處理[初始化集合和代理](http://docs.jboss.org/hibernate/core/4.0/manual/en-US/html/performance.html#performance-fetching-initialization)。 Spring還提供了[「在視圖中打開會話過濾器」的實現](http://static.springsource.org/spring/docs/3.1.x/javadoc-api/org/springframework/orm/hibernate4/support/OpenSessionInViewFilter .html)由Hibernate文檔提到。 – millimoose