论坛首页 Java企业应用论坛

关于pojo、dao、service的困惑

浏览 42543 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
作者 正文
   发表时间:2006-10-25  
在很久很久以前,是没有Hibernate这种武装到牙齿的ORM,那个时候偶们需要DAO接口来隔离不同数据库的特性
在很久以前,有了ORM,偶们就不需要DAO这种接口了...
0 请登录后投票
   发表时间:2006-10-25  
Arden 写道
可以参考一下JBoss seam和Grails框架,以及Springside团队的开发框架,也可以借一下ROR的思想,我认为在JAVA领域里真的没有必要为了分层而要层,简单就是美,当真的不能满足要求的时候就重构也不迟!前段时间我也写了个基于spring/hibernate/webwork的开发框架,完全是根据ROR的思想启发,帮你少去了DAO、Service等层,整个开发流程简洁,使用轻松,如果想进一步交流的话,可以看看我的BLOG:http://www.ugole.com


我看你的博客上面都是粘贴过来不标明转载的文章,还在这里搞宣传?
0 请登录后投票
   发表时间:2006-10-25  
多谢大家的回复,我试着总结一下,看看对不?

1、首先建模时要建域模型而不是关系数据模型,然后用Hibernate等的hbm2ddl等工具自动生成表结构,一方面使对象间的关系更加清晰,另一方面省去繁琐的建表过程(特别是对于不同的数据库)。

2、pojo、dao、service的结构是为了更加可扩展,更加健壮,是前人其仆后继经验的总结。比如:daoInterface就是为了隔离不同数据库或者不同持久化方法,加上为了以后可以扩展,以后在增加一种实现方式也不用改上层代码。

3、但不一定对于什么项目都要照搬,要掌握原理、灵活运用。比如不必要每个pojo对应一个dao,一个service,如果函数少的时候完全可以放在一个service里面。

robbin 写道
Arden 写道
可以参考一下JBoss seam和Grails框架,以及Springside团队的开发框架,也可以借一下ROR的思想,我认为在JAVA领域里真的没有必要为了分层而要层,简单就是美,当真的不能满足要求的时候就重构也不迟!前段时间我也写了个基于spring/hibernate/webwork的开发框架,完全是根据ROR的思想启发,帮你少去了DAO、Service等层,整个开发流程简洁,使用轻松,如果想进一步交流的话,可以看看我的BLOG:http://www.ugole.com


我看你的博客上面都是粘贴过来不标明转载的文章,还在这里搞宣传?


我的blog转载后也没注明,看来以后要改正了!!!
0 请登录后投票
   发表时间:2006-10-25  
robbin 写道
Arden 写道
可以参考一下JBoss seam和Grails框架,以及Springside团队的开发框架,也可以借一下ROR的思想,我认为在JAVA领域里真的没有必要为了分层而要层,简单就是美,当真的不能满足要求的时候就重构也不迟!前段时间我也写了个基于spring/hibernate/webwork的开发框架,完全是根据ROR的思想启发,帮你少去了DAO、Service等层,整个开发流程简洁,使用轻松,如果想进一步交流的话,可以看看我的BLOG:http://www.ugole.com


我看你的博客上面都是粘贴过来不标明转载的文章,还在这里搞宣传?


首先多谢robbin的提醒,里面的文章确实大部分是转载的,但通常转载的文章在标题上注明了(转)这字样,只不过为了偷懒就没有详细注明是从哪里转载过来的,其实互联网就是这样,我从别的地方搞过来同时也不知道那个地是从哪里搞过来的,这个BLOG最终的目的就是收集一些我认为比较有意义的文章在里面,大家进来就感觉是大家需要看的文章!
0 请登录后投票
   发表时间:2006-10-25  
在csdn上看到一篇不错的文章,转过来大家看看:

1,dao和service对应
一般情况下,Hibernate DAO只操作一个POJO对象,因此一个DAO对应一个POJO对象。

Service层是为了处理包含多个POJO对象(即对多个表的数据操作)时,进行事务管理(声明式事务管理)。Service层(其接口的实现类)被注入多个DAO对象,以完成其数据操作。

2, Service之有无

   这一点我的看法未必正确,我的脑海现在有两种构建业务层的模式:

   模式1是Service + DAO,即DAO中只做CRUD及类似的简单操作(称之为功能点,不包含业务逻辑),Service中通过调用一个或多个DAO中的功能点来组合成为业务逻辑.Service的数量应该由功能模块来决定。

   在这种模型中业务逻辑是放在Service中的,事务的边界也应该在Service中控制. 当然,直接在Service中控制事务会引入非业务逻辑的代码,幸好Spring的AOP可以解决这个问题,这也是引入Spring的原因之一.

    如果说到缺点,就在于对某些对象的操作就是简单的CRUD,Service层显得累赘.

    模式2是Service + BO, 而BO = DAO + 业务方法, 在原先DAO的基础上添加业务方法,形成BO对象。需要注意的是BO中的业务方法往往是针对一个实体对象的,如果需要跨越多个实体对象,则方法应该放在Service中。

    举例来说,一个简单的银行帐户管理系统,创建帐户这个BO对象,里面可以有修改密码,取钱等业务方法(不难看出,这些方法都只对单个帐户对象进行操作)。现在需要添加一个转账方法,就应该放在Service中。

    这里Service和BO的关系是什么样的呢?再举一例:以国家行政机关为例:粮食局负责收粮,卖种子等,建设部负责审批土地买卖,建设公路等,这都是行政部分份内的事儿。突然某地发了水灾,救灾时需要粮食局开仓放粮,建设部修建临时房屋,如何协调两个部门?就需要成立专门的救灾委员会,由救灾委员会出面对两个部分的资源进行调拨。这里两个部分就是BO,而救灾委员会就是Service。不知我的意思是否表达准确了,呵呵。

    模式1的在划分Service和DAO时界限清晰,但会带来一些无必要的代码。
    模式2的划分相对复杂,然而可以提高编码效率。

    当然小规模的应用中,没有Service,完全是DAO或BO也是可以接受的。

3,Service和DAO的接口之有无

    接口是一种契约,它可以有多种实现。所以接口之有无取决于具体实现是否需要多样化。如果铁定一种DAO或一种Service只有一种实现,那么抽象出接口的意义不大。然而一些大型应用或许需要DAO和Service的多种实现(比如上面例子中的帐户DAO,可能需要一种Hibernate实现、一种CMP实现和一种JDO实现),为了向上一层隐藏具体实现类,需要采用接口。

    隐藏具体实现类的创建过程,这有两种方法:一是实用工厂方法,代价是代码量大(每个DAO和Service一个工厂)。二是使用Spring的IoC,实现依赖注入,不需要写额外的代码,这也是引入Spring的理由之二。

0 请登录后投票
   发表时间:2006-10-25  
55个service

22个DAO

141个Pojo


很多DAO都可以用公用的方法的
service一般是看有多少种模块
同一模块的放在一起.......

(此项目使用了EJB&hibernate)
0 请登录后投票
   发表时间:2006-10-27  
哎!~,本人也在研究中,等学明白了再与大家一起切磋喽!~
0 请登录后投票
   发表时间:2006-11-03  
我的理解是service负责业务逻辑,所以可能和多个dao打交道。dao只负责最简单的数据存取。pojo用来表现数据库里的数据对象。在只有crud操作时,service是可以省略的。
0 请登录后投票
   发表时间:2006-11-04  
ecsun 写道
其实对于项目来说,你的DAO有时候只需要一个,就像getHiberanteTemplate()一样,它可以用来保存任何对象,而你的这个DAO,也要完成这样的功能。
在设计完这个DAO后,可以将这个DAO注入到BaseService中,当然BaseService实现IBaseService,然后你的具体业务,如ICourseService extends IBaseService
而你的 CourseSerive extends BaseService。
如果你的Service只是简单的保存数据操作,你的Service可以简单到这种程度:
public class Service extends BaseService{
}
别的什么都不用写。有业务处理的话,仅仅关注具体的业务而已,不用关注什么基础数据处理。回头给你一个我的实现。


没错我在一个项目中也基本只用了BaseDao的方法就已经满足一般的CRUB了
在我的帖子中也有讲到:http://firefly.iteye.com/blog/26171

但是iBatis就没有那么好的像 Hibernate的getHiberanteTemplate()那样,可以解决大部门的CRUB了,毕竟iBatis得加上statementName,如:getSqlMapClientTemplate().insert( statementName,  parameterObject) ;而statementName每个表都的定义都不一样!

0 请登录后投票
   发表时间:2006-11-04  
可以借鉴一下Rod的做法
参见《without ejb》中文版285页
0 请登录后投票
论坛首页 Java企业应用版

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