Vincent

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

          在filter中關(guān)閉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-09-01 13:51 Binary 閱讀(470) 評論(0)  編輯  收藏 所屬分類: Hibernate

          主站蜘蛛池模板: 海宁市| 泸定县| 溧水县| 吉木萨尔县| 长阳| 福贡县| 衡水市| 环江| 永昌县| 马龙县| 广汉市| 利辛县| 凤城市| 永善县| 泰和县| 乾安县| 鹤庆县| 肇东市| 疏附县| 安多县| 泰来县| 皋兰县| 新沂市| 兴文县| 阿勒泰市| 崇义县| 九寨沟县| 彩票| 海伦市| 平邑县| 田东县| 安多县| 清徐县| 阜城县| 宁晋县| 额敏县| 都匀市| 罗山县| 北安市| 商洛市| 平和县|