j2ee中的事务处理

来源:互联网 发布:caffe cudnn 版本 编辑:程序博客网 时间:2024/05/20 15:41


    事务处理应由业务层负责,不应由dao层负责。应该怎么做呢?

先看dao,有这样一个方法
    public List findByUser(Session sess, User user, int pageNo){

          return sess.createQuery("from Photo p where p.user = :user")

              .setEntity("user", user)

              .setMaxResults(PAGE_SIZE)

              .setFirstResult(PAGE_SIZE * (pageNo - 1))

              .list();
     }

    在这里,并没有open Session,而是把Session作为方法的参数传来,再调用查询方法.

再看业务层是怎么写的.

    public List<PhotoHolder> getPhotoByUser(String user, int pageNo){

          Session s = HibernateUtil.currentSession();

          Transaction tx = s.beginTransaction();

     //调用DAO方法返回指定用户、指定页的所有Photo

          List pl = pd.findByUser(s, ud.findByName(s, user), pageNo);

     //将查询结果封装成集合后返回

          List<PhotoHolder> result = new ArrayList<PhotoHolder>();

     //遍历查询结果

          for (Object o : pl ){

              Photo p = (Photo)o;

              result.add(new PhotoHolder(p.getTitle(), p.getFileName()));

          }

          tx.commit();

          HibernateUtil.closeSession();

          return result;
    }

在业务层方法中,再open session,再beginTransaction().

    为什么事务处理要由业务逻辑层负责呢?

    使用Hibernate进行数据库访问时,事务是通过Session开始的,如果Session在DAO方法中打开,则事务

控制降低到DAO层次,对单个的DAO方法增加事务控制是没有意义的(考虑这样一个场景:从A账户向B账户转账,

A账户的余额减少是一个DAO操作,如果事务控制在DAO层次上,A账户的余额减少是具有原子性的,但可能A账户

的余额减少了,但B账户的余额没有增加,这将导致数据的不一致)。事务应该对整个业务逻辑操作起作用,也就

是说,事务应该在整个业务逻辑层次上,绝不能降低到DAO层次上。