Vincent

          Vicent's blog
          隨筆 - 74, 文章 - 0, 評論 - 5, 引用 - 0
          數據加載中……

          在filter中關閉session

          利用Thread-Specific Storage撰寫一個HibernateUtil

          HibernateSessionUtil.java
          																import java.io.Serializable;

          import net.sf.hibernate.HibernateException;
          import net.sf.hibernate.Session;
          import net.sf.hibernate.SessionFactory;
          import net.sf.hibernate.Transaction;

          public class HibernateSessionUtil implements Serializable
          {
          publicstaticfinal ThreadLocal tLocalsess = new ThreadLocal();

          publicstaticfinal ThreadLocal tLocaltx = new ThreadLocal();

          /*
          * getting the thread-safe session for using
          */
          publicstatic Session currentSession(){
          Session session = (Session) tLocalsess.get();

          //open a new one, if none can be found.
          try{
          if (session == null){
          session = openSession();
          tLocalsess.set(session);
          }
          }catch (HibernateException e){
          thrownew InfrastructureException(e);
          }
          return session;
          }

          /*
          * closing the thread-safe session
          */
          publicstatic void closeSession(){

          Session session = (Session) tLocalsess.get();
          tLocalsess.set(null);
          try{
          if (session != null && session.isOpen()){
          session.close();
          }

          }catch (HibernateException e){
          thrownew InfrastructureException(e);
          }
          }

          /*
          * begin the transaction
          */
          publicstatic void beginTransaction(){
          Transaction tx = (Transaction) tLocaltx.get();
          try{
          if (tx == null){
          tx = currentSession().beginTransaction();
          tLocaltx.set(tx);
          }
          }catch (HibernateException e){
          thrownew InfrastructureException(e);
          }
          }

          /*
          * close the transaction
          */
          publicstatic void commitTransaction(){
          Transaction tx = (Transaction) tLocaltx.get();
          try{
          if (tx != null && !tx.wasCommitted() && !tx.wasRolledBack())
          tx.commit();
          tLocaltx.set(null);
          }catch (HibernateException e){
          thrownew InfrastructureException(e);
          }
          }

          /*
          * for rollbacking
          */
          publicstatic void rollbackTransaction(){
          Transaction tx = (Transaction) tLocaltx.get();
          try{
          tLocaltx.set(null);
          if (tx != null && !tx.wasCommitted() && !tx.wasRolledBack()){
          tx.rollback();
          }
          }catch (HibernateException e){
          thrownew InfrastructureException(e);
          }
          }

          privatestatic Session openSession() throws HibernateException{
          return getSessionFactory().openSession();
          }

          privatestatic SessionFactory getSessionFactory() throws HibernateException{
          return SingletonSessionFactory.getInstance();
          }
          }

           filter中的程式碼如下

          HibernateSessionCloser.java
          																public class HibernateSessionCloser implements Filter{

          protected FilterConfig filterConfig = null;

          public void init(FilterConfig filterConfig)throws ServletException{
          this.filterConfig = filterConfig;
          }

          public void destroy(){
          this.filterConfig = null;
          }

          public void doFilter(ServletRequest request, ServletResponse response,
          FilterChain chain)
          throws IOException, ServletException {
          try{
          chain.doFilter(request, response);
          }
          finally{
          try{
          HibernateSessionUtil.commitTransaction();
          }catch (InfrastructureException e){
          HibernateSessionUtil.rollbackTransaction();
          }finally{
          HibernateSessionUtil.closeSession();
          }
          }

          }
          }

          然後在操作資料庫之前加上

          HibernateSessionUtil.beginTransaction();
          HibernateSessionUtil.currentSession();//取得Session

          posted on 2006-08-24 15:24 Binary 閱讀(229) 評論(0)  編輯  收藏 所屬分類: Hibernate

          主站蜘蛛池模板: 天峻县| 保山市| 彰化市| 西藏| 扶绥县| 呼伦贝尔市| 交城县| 灌云县| 达拉特旗| 望奎县| 上犹县| 怀仁县| 民丰县| 兴业县| 德清县| 正宁县| 慈利县| 故城县| 隆回县| 敖汉旗| 南宁市| 中西区| 福安市| 洛隆县| 张家港市| 叙永县| 永靖县| 宿迁市| 贵溪市| 西充县| 洱源县| 和政县| 梁河县| 名山县| 璧山县| 茶陵县| 五河县| 七台河市| 徐水县| 瑞丽市| 洛宁县|