论坛首页 Java企业应用论坛

有了hibernate是否还需要Dao?

浏览 28678 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
作者 正文
   发表时间:2008-01-18  
解耦合这个是最重要的.
分层不清楚的话以后扩展很难的.
现在做程序不是说实现功能就OK的.
一个程序百分之80的生命周期是在维护.
要长期考虑.
J2EE最正规是18层架构.
0 请登录后投票
   发表时间:2008-01-18  
dmewy 写道
解耦合这个是最重要的.
分层不清楚的话以后扩展很难的.
现在做程序不是说实现功能就OK的.
一个程序百分之80的生命周期是在维护.
要长期考虑.
J2EE最正规是18层架构.


这些都是他妈的客套话。
2 请登录后投票
   发表时间:2008-01-20  
对于lz的问题:
1.dao的出现本来是解耦业务层和数据的操作的,你这里比较简单,可能简单到一句话,但还是保留dao比较好,难保会有复杂的情况吧。
2.一个action,一个crud操作而已,那么确实可以省略service,还是老话,因为上面的理由,还请在适当的时候保留service。
3.web+service,service中多次crud重用一个session;这样是可以的。
由此看出其实三个问题都是一个问题,就是该不该解耦dao和service,简单的情况下,当然会找理由说服自己别那么麻烦,但是复杂的情况就会发现这么做的价值了。
0 请登录后投票
   发表时间:2008-01-21  
其实还是很有必要分层的。如果你尝试从没有任何框架 直接在页面上写JDBC 实现一些简单的功能,然后准备在这之上增加一些功能 的话 你会发现分层的意义了。
0 请登录后投票
   发表时间:2008-01-24  
有的时候是为测试考虑
0 请登录后投票
   发表时间:2008-03-01  
我相信,DAO只是为了方便大家去维护和更新,能让人一目了然而已
0 请登录后投票
   发表时间:2008-03-02  
先说句废话:要根据实际情况决定.
不过根据楼主描述的现象,我个人倾向于不要这种细粒度DAO层,做个公共的DAO对hibernate进行一次封装就可以了.
0 请登录后投票
   发表时间:2008-03-09  
抛出异常的爱 写道
zbird 写道
就个人而言,我不喜欢DAO。
DAO不是万能药,解耦并不是加个DAO就能解决的问题。
对于大多的简单操作,Hibernate封得已经够完善了,大多时候加个DAO费力不讨好。
如果操作复杂,Service层过于混乱,这时候再抽取出个DAO也没什么不可以。
说到使用DAO解耦,大家最喜欢举的例子就是换实现。以前是说换数据库,现在Hiberate对数据库封得差不多了。于是说法改成将hibernate换成其他的实现,如jdbc等。
但真实项目中有谁有事没事的去换这些东西。
耦是有了才需要解的,如果凭空想出很多不实在的需求,无非是给自己自找麻烦。
我一直在说....
不是为了移植
而是为了管理方便

当然你可以把业务逻辑
与数据库逻辑写在一起
当只有一二个表时
并没什么不好解理
当一个操作关系到:
日志表,
权限表,
业务级联表,
操作记录表,

用人类的智力要从这么多的代码中找到逻辑.....还是差点意思



大哥的理解确实很高,多谢了
0 请登录后投票
   发表时间:2008-03-18  
楼主说的有道理,但是在想想,采用dao service的主要目的有两个:实现系统的分层,降低模块之间的耦合度。如果不用dao,将是你的应用服务层service同hibernate机密的集合起来,如果不要service,你的action同样同和ibernate或者jdbc机密结合,增加模块之间的耦合度,而且降低了模块的重用性。我估计你开发的是一个较小的系统,大型系统像你说的那样,可定带来很多不必要的重复代码编写,带来极大的维护难度,也不宜与调试和排错,更不用说将来的系统扩展。
0 请登录后投票
   发表时间:2008-04-18  
简单说两句关于DAO的看法。
我觉得如果对Persistent的理解已经到了JPA的时代,那么DAO是不需要的,甚至是不能要的。

先说为什么不需要。
持久的目的是什么?是存储对象的瞬时状态。将其简单理解为对数据库的CRUD是比较狭隘的。如果,内存足够大、计算机永远不会断电,程序员永远不反错误,那么可以不去持久化。
以JPA(Hibernate)的观点来看,一个对象只有两种状态:持久的和非持久的。让一个非持久的对象变为持久对象只需调用persist()方法将其加入持久域;让一个持久的对象变为持久对象则调用remove()方法使其脱离持久域;如果让一个持久对象刷新其状态就调用flush()方法;如果想undo那么就refresh()。至于那些烦人琐事,让Hibernate那个倒霉蛋去干吧。事情就是这么简单。
如果看透了这一点,那么DAO就可以去光荣下岗了。

再说为什么不能要。
这个解释起来很简单,看看代码就知道了。
public class Person {
    private int id;
    private List<Something> things;
    ...
}
public class Something{
    private int id;
    private Person owner;
    private String name;
    ...
}

很简单的一对多关联,与之对应有了PersonDao和SomethingDao,它们是的实现类中用Hibernate完成CRUD。
来看看“R”吧,它就是把DAO送进坟墓的人。
public void doSomething() {
    Person me = personDao.get(myId);
    //我可以这样做吗?
    List<Something> myThings  = person.getThings();
    //还是要这样做?
    myThings = somethingDao.getThingsOf(me);
}


如果你不想在Hibernate一棵树上吊死,那么就用JPA吧。如果你也不想在JPA上吊死那就自己定义一个XXXPA也可以。不过,在这之前,先认真地想一想你所知道的软件的生命周期内是不是真的会换掉Hibernate呢?
0 请登录后投票
论坛首页 Java企业应用版

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