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