2012-06-30 43 views
1

我在我的項目中使用休眠,它很好,但我的問題是我有點困惑,這是我正在寫好休眠功能的好方法。下面我粘貼我的代碼塊,瞭解我如何編寫休眠功能,請檢查它並告訴我它是否是正確的方法。下面是我的塊碼正確的方法來寫休眠功能

SessionFactory sessionFactory = 
       (SessionFactory) ServletActionContext.getServletContext().getAttribute(HibernateListener.KEY_NAME); 
     Session hibernatesession = sessionFactory.openSession(); 
     try { 
      hibernatesession.beginTransaction(); 
      // my database access will be here 
      hibernatesession.getTransaction().commit(); 
      hibernatesession.flush(); 
      } 
     catch(Exception e){ 
      hibernatesession.getTransaction().rollback(); 
      e.printStackTrace(); 
     }finally{ 
      hibernatesession.close(); 
     } 

這種結構是,我有我所有的DAO類函數創建的結構,但現在我的網站載入速度很慢。所以我的問題是我使用的狹窄是正確的。上面的代碼是否會導致一次打開多個會話休眠。

回答

1

在DAO類中進行事務管理並不是好設計。我會熱烈推薦使用Spring及其聲明式事務管理,這是一種輕而易舉的設置,也是一種不費吹灰之力的使用方式。如果你沒有這個機會,那麼你至少應該成爲一個窮人的選擇。一個建議是使每個DAO成爲一個類的子類,該類具有一個方法來處理樣板部分(會話打開/關閉,事務開始/提交)並調用一個可覆蓋的方法來完成實際工作。這將爲您的方案實施模板模式。這是一個輪廓:

public abstract class DaoTemplate 
{ 
    public void execute() { 
    final Session s = ((SessionFactory) ServletActionContext.getServletContext() 
     .getAttribute(HibernateListener.KEY_NAME)).openSession(); 
    try { 
     s.beginTransaction(); 
     doTheRealStuff(); 
     s.getTransaction().commit(); 
    } 
    catch(Exception e) { 
     s.getTransaction().rollback(); 
     e.printStackTrace(); 
    } finally { s.close(); } 
    } 

    protected abstract void doTheRealStuff(); 
} 

另一項建議,有事我居然在一個項目上十年前使用,是落實戰略模式。在這種情況下,您會將一個對象傳遞給execute,該對象實現方法doTheRealStuff。此外,在這種情況下,DaoTemplate類可能是一個單身人士(然後類別的不同名稱將是適當的)。

1

flush()之後commit()沒用。

您是否確實需要打開一個新的會話,然後關閉您的每個操作?可以使用sessionFactory.getCurrentSession()Hibernatesession.disconnect()