锁定老帖子 主题:关于pojo、dao、service的困惑
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
|
|
---|---|
作者 | 正文 |
发表时间:2006-11-04
我的理解
DAO 有两个作用 1.团队开发约定 2.方便重构 SERVICE 多DOMAIN 多DAO的操作 还有就是方便针对业务级的事务 不过我有个疑问 DAO该怎么定义 才能满足复杂的CRUD 有没有一种最佳实现? |
|
返回顶楼 | |
发表时间:2006-11-04
huangpengxiao 写道 我的理解
DAO 有两个作用 1.团队开发约定 2.方便重构 SERVICE 多DOMAIN 多DAO的操作 还有就是方便针对业务级的事务 不过我有个疑问 DAO该怎么定义 才能满足复杂的CRUD 有没有一种最佳实现? 普通DAO的没有增删改 只有一个通用的DAO可以进行增删改 大多DAO用来作复杂查询 一个主表大约会包含N个子表 可以形成M个不同的业务Bean 有M*2个方法..... |
|
返回顶楼 | |
发表时间:2006-11-04
抛出异常的爱 写道 huangpengxiao 写道 我的理解
DAO 有两个作用 1.团队开发约定 2.方便重构 SERVICE 多DOMAIN 多DAO的操作 还有就是方便针对业务级的事务 不过我有个疑问 DAO该怎么定义 才能满足复杂的CRUD 有没有一种最佳实现? 普通DAO的没有增删改 只有一个通用的DAO可以进行增删改 大多DAO用来作复杂查询 一个主表大约会包含N个子表 可以形成M个不同的业务Bean 有M*2个方法..... 你说的复杂查询是不是说针对这个DOMAIN的业务所做的查询 springside中HibernateEntityDao似乎是这个通用的DAO 业务层呢 可不可以也抽象出一个这种类? 引用 一个主表大约会包含N个子表
可以形成M个不同的业务Bean 有M*2个方法..... 这句不太明白 可否详细说下 |
|
返回顶楼 | |
发表时间:2006-11-04
robbin 写道 Arden 写道 可以参考一下JBoss seam和Grails框架,以及Springside团队的开发框架,也可以借一下ROR的思想,我认为在JAVA领域里真的没有必要为了分层而要层,简单就是美,当真的不能满足要求的时候就重构也不迟!前段时间我也写了个基于spring/hibernate/webwork的开发框架,完全是根据ROR的思想启发,帮你少去了DAO、Service等层,整个开发流程简洁,使用轻松,如果想进一步交流的话,可以看看我的BLOG:http://www.ugole.com
我看你的博客上面都是粘贴过来不标明转载的文章,还在这里搞宣传? 看来老大比较注意版权啊。不过我觉得网络上的东西好的就收藏了,毕竟是集体的智慧,就象论坛一样。只要不是拿别人的东西挂自己的名字就行,如果是这样就是剽窃了:) |
|
返回顶楼 | |
发表时间:2006-11-06
我现在做的一个项目就是象楼主所说那样做的。但是我觉得好像我们的DAO中没办法不出现涉及业务的操作。那样想在把业务全部放在Service,而DAO中全是增删改的普通操作似乎也难以完全执行。我甚至有在Dao和Service两层中在加一层,用于一些数据的处理,以便真正把业务和数据处理分开,达到以后代码的重用,但是似乎代码量又增加了很多。矛盾啊!
|
|
返回顶楼 | |
发表时间:2006-11-06
我觉得简单、合理、高效就是美,不管你采用那一个合组方式都一样,都是为了做同一件事!!
|
|
返回顶楼 | |
发表时间:2006-11-06
renyangok 写道 在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的理由之二。 这里的模式1应该类似失血的Domain Model ,模式2类似于贫血的Domain Model,可以看robbin的文章 http://www.iteye.com/topic/17579 |
|
返回顶楼 | |
发表时间:2006-11-12
刚看资料,说是可以用一个泛型,写一个通用的dao,其他的继承,然后穿入类型等参数,也可以吧,不成熟的见解,希望看到准确代码
|
|
返回顶楼 | |
发表时间:2006-11-13
在使用ORM的情况下DAO层基本没有存在的意义
service直接继承BaseDAO 根据情况决定是否加一层接口 |
|
返回顶楼 | |
发表时间:2006-11-13
这个主要还是为了灵活和oo的思想,个人感觉要将业务逻辑放在service layer里面,数据库操作放到DAO那里,用接口是为了以后的灵活,分层是为了设计上的清晰。
|
|
返回顶楼 | |