posts - 60,comments - 71,trackbacks - 0

                  session是hibernate運做的核心,是有SessionFactory所創(chuàng)建,sessionFactory是線程安全的,你可以讓多個線程同時存取SessionFactory,而不會有資源共用的問題,然而session不是設(shè)計為線程安全的,所以讓多個線程共用一個session,將發(fā)生資料共用而發(fā)生混亂的問題.下面是一個標準類.
          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
          {
               
          //創(chuàng)建線程局部變量 tLocalsess 
              public static final ThreadLocal tLocalsess = new ThreadLocal();
             
          //創(chuàng)建線程局部變量 tLocaltx
          public static final ThreadLocal tLocaltx = new ThreadLocal();
                
          //取得session
              public static Session currentSession(){
                   
          //從線程變量tLocalsess中,取得當前session
          Session session = (Session) tLocalsess.get();
          //判斷session是否為空,如果為空,將創(chuàng)建一個session,并付給線程變量tLocalsess
              try{
          if (session == null){
          session 
          = openSession();
          tLocalsess.set(session);
          }

          }
          catch (HibernateException e){
          throw new InfrastructureException(e);
          }

          return session;
          }

          //關(guān)閉當前session
              public static void closeSession(){

                   
          //從線程變量tLocalsess中,取得當前session
          Session session = (Session) tLocalsess.get();
                   
          //設(shè)置線程變量tLocalsess為空
          tLocalsess.set(null);
          try{
                      
          //關(guān)閉session
          if (session != null && session.isOpen()){
          session.close();
          }

          }
          catch (HibernateException e){
          throw new InfrastructureException(e);
          }

          }

          //事物處理
              public static void beginTransaction(){
                
          //從線程變量tLocaltx中取得事物管理對象Transaction
                  Transaction tx = (Transaction) tLocaltx.get();
          try{
                      
          //如果為空就從session中創(chuàng)建一個tx
          if (tx == null){
          tx 
          = currentSession().beginTransaction();
          tLocaltx.set(tx);
          }

          }
          catch (HibernateException e){
          throw new InfrastructureException(e);
          }

          }

          //提交事物
              public static void commitTransaction(){
                
          //取得事物
          Transaction tx = (Transaction) tLocaltx.get();
          try{
                      
          //如果不為空就提交
          if (tx != null && !tx.wasCommitted() && !tx.wasRolledBack())
          tx.commit();
          tLocaltx.set(
          null);
          }
          catch (HibernateException e){
          throw new InfrastructureException(e);
          }

          }

              
          //事物回滾    
              public static void rollbackTransaction(){
                   
          //取得tx事物
          Transaction tx = (Transaction) tLocaltx.get();
          try{
                      
          //將變量清空
          tLocaltx.set(null);
          if (tx != null && !tx.wasCommitted() && !tx.wasRolledBack()){
                          
          //事物回滾
          tx.rollback();
          }

          }
          catch (HibernateException e){
          throw new InfrastructureException(e);
          }

          }


             
          //取得session
          private static Session openSession() throws HibernateException{
          return getSessionFactory().openSession();
          }


             
          //取得sessionFactory
          private static SessionFactory getSessionFactory() throws HibernateException{
          return SingletonSessionFactory.getInstance();
          }

          }

          filter的代碼:
          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();
          }

          }

          }

          }


          然后在web.xml配置filter就可以使用了.
          posted on 2008-05-18 20:36 henry1451 閱讀(636) 評論(0)  編輯  收藏 所屬分類: Hibernate技術(shù)
          主站蜘蛛池模板: 苍溪县| 阿克苏市| 东乌| 家居| 临泉县| 临城县| 蒙城县| 老河口市| 邮箱| 陵川县| 元氏县| 辽宁省| 平和县| 宁都县| 宿松县| 安溪县| 休宁县| 广宗县| 皮山县| 德钦县| 项城市| 津南区| 航空| 栖霞市| 天气| 即墨市| 汽车| 成武县| 阿拉尔市| 长沙市| 汉阴县| 阿拉善左旗| 南丰县| 弥渡县| 五原县| 土默特右旗| 资溪县| 临湘市| 南江县| 西平县| 庆云县|