论坛首页 Java企业应用论坛

关于DAO API的取舍

浏览 28063 次
该帖已经被评为精华帖
作者 正文
   发表时间:2005-03-08  
Dao 中没有 session.close() 的语句确定没有问题么?
我能查到的 Dao 编程中,有很多都没见到关闭 Session 的语句,
确定这样没有问题么?

但是如果,dao中有关闭session的语句的话,如何能保证数据的完整性?
比如,有一数据的必须同时保存在几张表内,如果有一个错误就必须回滚

如果每张表都有一个 dao , dao内又有session.close,那么就不能做到数据的完整性了
因为有部分数据已经存储了

比如存储了主表的数据,但是细表的数据没有存储
0 请登录后投票
   发表时间:2005-03-08  
推荐楼主看看这个帖子后面的讨论:

http://forum.iteye.com/viewtopic.php?t=10972
0 请登录后投票
   发表时间:2005-03-08  
liang_chen 写道
http://www.ociweb.com/jnb/jnbNov2003.html把DAO这种体力活很好地避免了。

这篇文章是从曹晓钢的BLOG那看的,后来得知是从冰云的BLOG里看来的。


呵呵,这个Command模式的已经推了很久了,不过好像还没看到什么很好的使用

我觉得DAO层难以避免,在Hibernate的情况DAO层起到的主要作用就是对于此PO的查询,毕竟这些大多数是需要通过HQL来实现的,另外一个作用我觉得是软件体系中的层次分离,DAO层作为数据源层,而之上的Domain Model层与之通讯而已,如果将HQL放入Domain Model,系统的结构一定层次上来说就变得有些混乱。
0 请登录后投票
   发表时间:2005-03-15  
实现一个model-hql转换器很复杂吗????
0 请登录后投票
   发表时间:2005-04-08  
inteface MessageDAO{

public void saveMessage(Message message);

public void deleteMessage(Integer id);

}

public class MessageDAOImpl implement MessageDAO{

private Session sessioin;
//getter setter method for the session
public void saveMessage(Message message){
   
    session.save(message);
 
}

public void deleteMessage(Integer id){

   session.delete(Message.class, id);
}

}

interface MessageService{

   public void doSomething();
}

public class MessageServiceImpl implement MessageService{
   
   private MessageDAO dao;
   // getter setter method for the dao

   public void doSomething(){
    Session session = HibernateSessionFactory.openSession();
   ( (MessageDAOImpl)dao).setSession(session);
  try{
    Transaction tx = session.beginTransaction();
    Message message = new Messeage();
    dao.save(Message);
    dao.delete(Message.class,new Integer(1));
    session.commit();

  }catch(HibernateException e){
   if (tx!=null){
   tx.rollback;
}finally{
   session.close();
}
}
}

}

public class Test{

public static void main(String[] args){

MessageService service = new MessageServiceImpl();
MessageDAO dao = new MessageDAOImpl();
service.setDAO(dao);

service.doSomething();
}
}

Service 层要控制事务就需要得到一个session。这样感觉DAO层就没有必要。

感觉很别扭。直接在Service上写就行了。实在是不知道怎么办。以前都是用spring来整合hibernate的。难道没有了spring,hibernate就不能使用DAO了吗?

好迷茫!
0 请登录后投票
   发表时间:2005-04-09  
有时候写的DAO简直就是浪费生命.比如说有StydentDao,还有TeacherDao什么的.但是其实代码也差不多,完全可以把一个dao完全复制过去,然后查找->修改,把原来的student全部修改成为teacher,没有任何问题,反正我自己搞的全部都是这样

记得原来看的C++的书是<<modern C++ design>>,里面的对于泛型的使用真是令人惊叹.倒是也容易让人又回到复杂的语言层次的东东了,技术是很好,但是太负责了,呵呵

但是如果在dao中使用泛型的话,倒是符合泛型的本来的意图,避免无意义重复代码.从一个泛型dao组件派生出来大多数的可用dao组件,但是一直没有机会用java的泛型功能,什么时候一定要试试
0 请登录后投票
论坛首页 Java企业应用版

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