论坛首页 Java企业应用论坛

BO,DAO如何来分层清晰以及Session何处关闭的问题

浏览 16886 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
作者 正文
   发表时间:2007-06-22  
DAO

我的BaseDAO如下:

java 代码
  1. public class BaseDAO<t></t>   
  2. {   
  3.        
  4.     Session session;   
  5.            
  6.        
  7.     /**  
  8.      * @author   insKy  
  9.      * @time     2007-6-17  下午03:06:17  
  10.      * @version  1.0  
  11.      * @param t  
  12.      */  
  13.        
  14.   
  15.         public void create (T t) {   
  16.          try {   
  17.              session = SessionFactory.getSession();   
  18.              Transaction tx = session.beginTransaction();   
  19.                          session.save( t );   
  20.   
  21.              session.flush();   
  22.              tx.commit();   
  23.                     }catch(HibernateException e){   
  24.                 throw e;   
  25.             }finally{   
  26.           }   
  27.     }   
  28.     //update delete操作类似 此处代码略     
  29.     public void update (T t)   
  30.     public void delete(T t)   
  31. }  

 

其余Dao继承这个BaseDAO:

java 代码
  1. public class ColumnsDAO extends BaseDAO{   
  2.        
  3. //某些操作。。。  此处不显式调用父类的creat函数   
  4. }  
ColumnsAction中调用ColumnsDAO的create函数完成增加操作
  
然而Dao中出现事务操作是不合适的,所以这里想分出BO层处理session以及事务的处理,修改完后的BaseBO应该大体如下:
java 代码
  1. public void create (T t) {   
  2.          try {   
  3.              session.save( t );   
  4.               }catch(HibernateException e){   
  5.                 throw e;   
  6.             }finally{   
  7.           }   
  8.     }  

我的问题是

1,对应的BO应该如何处理?BaseDAO中的session应该如何获取?BO中如何传递过来?(没用Spring之用到Struts+Hibernate)session的获取是SessionFactory通过ThreadLocal获取的
//看了别人的程序,感觉如果用Spring来管理,不会遇到这些问题,这里没用Spring改如何来最好的管理session的传递?

2,是否也应该写一个BaseBO来对应处理BaseDAO中的各个操作以避免每个BO中处理crud操作?
请各位指教

   发表时间:2007-06-23  
wgfywin 写道
在J2EE体系中,JTA是独立于各种web和ejb组件之外提供的一个服务。
对于你的问题,我觉得应该是使用JTA来解决,在BO层,不管是CMT(使用ejb,或者spring的话),还是你自己使用userTransaction,Transaction都是你在BO中从APP平台中取得的Transaction服务,而不是session里面获取的。(好像有点偏题,呵呵)

如果我记的不是错太远的话,以前这边有帖子专门讨论过关于领域模型,业务建模的问题。
DAO提供的方法的connection或者hibernate的session是在business logic中传递给DAO的实现类的。(因为实际上,DAO一般是接口,然后提供一个DAOImpl来实现这个接口,business logic的代码是基于DAO接口编写的,从而脱离了对persistence具体方式(如DB)的依赖)。


xxLogic()
{
   Get Session,
  Get Transaction from Session.
  
  XXDAO dao = new XXXDAOImpl(session,xx);// or inject by spring, or use a factory to get the DAO.
   try{
      beginTrans;
      dao.accessData(xxx);
      dao.accessData2(yyy);
       ....
      commit;
      }catch(xxx){
         rollback;
      }finally{
         release resources.
      }
  
}
将connection或者session资源的获取放到business logic中就不应该了,business logic不应该偶合这些与业务无关的逻辑
0 请登录后投票
   发表时间:2007-06-23  
楼主,对范型的使用上就有问题.
0 请登录后投票
   发表时间:2007-06-24  
galaxystar 写道
楼主,对范型的使用上就有问题.

请指教...谢谢
0 请登录后投票
   发表时间:2007-06-25  
BaseDao后还需要各自entity的dao,写代码不写死了,要是有20个类,还得去copy 20个xxxDAO?

何不直接使用一个BaseDao,提供save,delete,update,query,findById方法。

使用:
User user = (User)baseDao.findById('123');
0 请登录后投票
   发表时间:2007-06-25  
yongyuan.jiang 写道
BaseDao后还需要各自entity的dao,写代码不写死了,要是有20个类,还得去copy 20个xxxDAO?

何不直接使用一个BaseDao,提供save,delete,update,query,findById方法。

使用:
User user = (User)baseDao.findById('123');

不知道您是否没仔细看,或者是我的代码没表达清楚我的意思,我的BaseDao中已经提供了crud方法,写BaseDao就是为了其余entity的dao中避免copy重复的crud方法
比如ColumnAction中直接调用ColumnDao的creat方法(继承父类BaseDao)就可以,而不用再在ColumnDao处理crud方法
0 请登录后投票
   发表时间:2007-06-25  
java 代码

其实我的主要疑问是当Dao中的session,事务操作都放到BO中后,BaseDao的crud操作改如何处理?是否也写个BaseBO做对应的操作?

其余的dao方法很容易处理,比如我ColumnsDao中有个取出所有一级栏目的操作getColList1()方法,改写后ColumnsDao对应的方法如下:

java 代码
  1. public List<Columns> getColList1() throws HibernateException {   
  2.   
  3.       try {   
  4.   
  5.        String hql = "from Columns where parentColumn is null and colStatus=1 order by colOrder";   
  6.        List<Columns> Collist=session.createQuery(hql)   
  7.         .list();   
  8.        return Collist;   
  9.       }catch(HibernateException e){   
  10.        throw e;   
  11.       }finally{   
  12.       }   
  13.      }  

 

对应ColumnsBO如下:

java 代码
  1. Session session;   
  2.  ColumnsDAO colDao;   
  3.  public List<Columns> getColList1(){   
  4.      session = SessionFactory.getSession();   
  5.      Transaction tx = session.beginTransaction();   
  6.      colDao = new ColumnsDAO(session);   
  7.      try {   
  8.          List<Columns> colList = new ArrayList<Columns>();   
  9.          colList = colDao.getColList1();   
  10.          tx.commit();   
  11.          return colList;   
  12.       }catch(HibernateException e){   
  13.        throw e;   
  14.       }finally{   
  15.       }   
  16.  }  

这样似乎很顺畅,但是遇到BaseDao里的crud方法,因为ColumnsDao根本就没出现过crud方法,ColumnsBO该如何处理?也写个BaseBO对应处理BaseDao的方法?感觉怪怪的...

BTW:不知道我是否能把我的意思表达清楚,语言表达能力有限,给各位舔堵了:(

0 请登录后投票
   发表时间:2007-06-25  
晕...发现所有范型有关的尖括号都被过滤掉了
0 请登录后投票
   发表时间:2007-06-26  
请看这篇文章《不要重复DAO》
http://www.ibm.com/developerworks/cn/java/j-genericdao.html
0 请登录后投票
   发表时间:2007-07-02  
异常为什么要这样处理呢?
# catch(HibernateException e){  
#        throw e;  
#       }
0 请登录后投票
论坛首页 Java企业应用版

跳转论坛:
Global site tag (gtag.js) - Google Analytics