j2ee中的事务处理


    事务处理应由业务层负责,不应由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层次上。

 

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值