Struts与Hibernate整合将Session和Transaction放在Filter中

修改HibernateSessionFactory文件(这个文件是由Hibernate帮我们自己动完成的)

加上如下内容:

private static final ThreadLocal trthreadLocal = new ThreadLocal();//事务线程

       /**

     * 打开事务

     */

    public static void OpenTransaction(){

       Transaction tran=(Transaction) trthreadLocal.get();

       if(tran==null){

           tran=getSession().beginTransaction();

           trthreadLocal.set(tran);

       }

    }

    /**

     * 提交事务

     */

    public static void CommitTransaction(){

       Transaction tran=(Transaction) trthreadLocal.get();

       if(tran!=null && !tran.wasCommitted() && !tran.wasRolledBack()){

           tran.commit();

           trthreadLocal.set(null);

       }

    }

    /**

     * 回滚事务

     */

    public static void RollbackTransaction(){

       Transaction tran=(Transaction) trthreadLocal.get();

       if(tran!=null && !tran.wasCommitted() && !tran.wasRolledBack()){

           tran.rollback();

           trthreadLocal.set(null);

       }

    }

新建一个开启与关闭SessionTransactionFilter

public class SessionTransactionFilter extends HttpServlet implements Filter {

   

    public void init(FilterConfig arg0) throws ServletException {

      

    }

   

    public void doFilter(ServletRequest arg0, ServletResponse arg1,

           FilterChain arg2) throws IOException, ServletException {

       try {

           HibernateSessionFactory.getSession();//打开session

           HibernateSessionFactory.OpenTransaction();//打开事务

           arg2.doFilter(arg0, arg1);

           HibernateSessionFactory.CommitTransaction();//事务提交

       } catch (Exception e) {

           HibernateSessionFactory.RollbackTransaction();//回滚事务

           e.printStackTrace();

       }finally{

           HibernateSessionFactory.closeSession();//关闭session

       }

    }

}

 

在我们的DAO中就可以不用管我们的SessionTransaction

1,  共公接口

public interface CommonDAO {

    public void save(Object obj);

    public void delete(Object obj);

    public void update(Object obj);

}

2,  共公方法

public class CommonDAOImple implements CommonDAO{

    public Session GetSession(){

       return HibernateSessionFactory.getSession();

    }

    public void delete(Object obj) {

       this.GetSession().delete(obj);

    }

    public void save(Object obj) {

       this.GetSession().save(obj);      

    }

    public void update(Object obj) {

       this.GetSession().update(obj);    

    }  

}

3,  具体的某一个城对象的interface如下:

public interface FlDAO extends CommonDAO {

    public TFl getone(int id);

    public List getall();

    public void delete(int id);

}

4,  具体的某一个城对象的DAO如下:

public class FlDAOImple extends CommonDAOImple implements FlDAO {

    public List getall() {

       Query query=this.GetSession().createQuery("from TFl");

       return query.list();

    }

    public TFl getone(int id) {

       return (TFl) this.GetSession().get(TFl.class, new Integer(id));

    }

    public void delete(int id) {

       Query query=this.GetSession().createQuery("delete TFl where FId=:id");

       query.setInteger("id", id);

       query.executeUpdate();

    }

}

 

5,  个人说明:

这样的做法可以解决Hibernate中的懒加载问题和每个方法中的Session开启与关闭,Transaction的开启与关闭。但是它带来的问题也是很大的

1,  Session的开启在客户端请求时打开,请求完全结束时关闭,这样Session的开启时间太长,而Session中是非线程安全的。并且一个Session保持与数据库一个连接,长时间的占用了数据库的资源。

2,  Transaction的开启时间在Session之后一点,关闭时间在Session之前一点,同样也开了很长的时间,这段时间内可能导致数据库里的数据库产生锁,别的线程没法操作数据。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值