论坛首页 Java企业应用论坛

有了hibernate是否还需要Dao?

浏览 28646 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
作者 正文
   发表时间:2008-01-14  
你的service中可以不用写前面两个方法呀,getBooks中直接调用dao中的两个方法,放在一个事务中
0 请登录后投票
   发表时间:2008-01-14  
我认为这个问题有点类似与“吃饭是否一定需要筷子?”
0 请登录后投票
   发表时间:2008-01-14  
tczengjin 写道
最近学习使用Struts2+Hibernate,也是分层,web层里放Struts2的action
service层里放业务逻辑对象,持久层里放的是dao+po,对po操作基本放到了dao里,可以我不解的是使用Hibernate的方法我返回本身就是po,为什么大家写程序的时候还写dao呢?我的dao里对po的操作几乎把它细分到了一个方法仅仅一次crud,我通过调用不同的dao里多次方法来实现业务中需要对不同的po进行多次的crud操作的情况,每调用一次dao的一个方法开个session然后对po进行一次crud操作又关session,那么session的缓存不是基本没什么作用了吗?还有一个问题就是通常po对应了一dao又对应了一service,我的dao的方法分的比较细(一个方法仅仅对po进行一次crud),我感觉我的service里仅仅只是重复调用了一遍dao的方法,然后在action中调用service层里不同的service对象实现稍微复杂的业务,我想过是不是service是用来把不同的dao的方法结合起来实现业务中需要对不同的po进行多次的crud操作的情况?这样在action中只要调用service中的方法那action里的代码就清爽了。但是我的action我也分的比较的细,一个action只针对用户的一步操作(多步操作可以用action chain串起来),一个页面可以有不同的action为用户不同的请求服务,action也是根据用户的一步操作命的名,我觉得根本不要把对action的多次操作的这样的业务放到service中,我想去掉service层直接在action中调用dao,原因是我的action是根据用户的一步业务操作命名,作为业务逻辑也好理解,几步操作可以用action chain,原因二是少了service层不用把数据又传到service层再调用一遍,原因三按照 黑体部分(见上面) 的考虑service到是有事情干了,可action干什么呢,难道是为了调service而存在的吗??关于web+service+dao+po这样的分层大家能能简单的说明下那三层究竟各负责什么,另外我知道要根据项目的具体情况合理分层,但我始终不明白service层的具体作用。
归纳下我的疑问:
1使用Hibernate的方法我返回本身就是po,为什么大家写程序的时候还写dao呢?我的dao里对po的操作几乎把它细分到了一个方法仅仅一次crud,每个方法一开session一关session,session的缓存不是几乎形同虚设了吗?
2我的web层的action我也分的比较的细,一个action只针对用户的一步操作(多步操作可以用action chain串起来),是否还需要service层?为什么?
3web(细,struts2支持按namespace对action划分)+service(使用Hibernate实现业务逻辑,稍复杂业务逻辑可以对不同po crud多次可以利用到session缓存)+po 一般情况的项目是不是这样分层更好一些呢?


1.解耦,道理上面很多朋友都给你解释了,不多说。如果觉得单纯字面上理解起来有困惑,可以去看看struts2-showcase里关于skill,employee那个例子的具体实现(记不太清楚了,呵呵)

复杂的商业逻辑中,一个事物会包含对于数据库多次的读写操作,dao中的每一个方法都开关session的话你如何处理此类事务?

2.清晰的层次结构会对你将来对系统的更新以及维护工作带来许多方便,该放在service层的逻辑你当然也可以放在action中或者dao层里,举例说,比如用户在页面操作,触发以下逻辑:找出当天所有系统应该通知的人(po),发送email且,更新这些人的某些属性。此类商业逻辑放在action或者dao中,都是不妥的,我想这就是service层存在的理由。

3.同1,解耦,dao层存在的理由是与persistent解耦,让你的项目不具体的依赖某一种persistent实现。可替换的persistent带来很多好处,比如对于简单的系统,你可以用mock写写原型什么的,功能,ui都可以实现,仅仅需要换掉persistent层就是一个大概成型的系统了。

 

0 请登录后投票
   发表时间:2008-01-15  
看了些回帖,总结如下,对不对?


举例:添加某条记录完成后显示新的列表页面
(
两步操作:
1.添加
2.查询列表
)
Action  控制工作流,只调用一个RecordsService,里面不写业务逻辑,这里的控制只控制页面的不同跳转,尽量不写Action的逻辑跳转,以免更改web层实现框架需要重写业务逻辑.

Service 实现业务逻辑,  提供具体服务,RecordsService提供添加和查询列表功能,这两个功能是按照业务逻辑将DAO的实现拼凑写在一个方法中,如果需要改动业务逻辑,只需要调用不同的DAO的方法,不需要改动Action.

DAO 实现对PO的访问,不写业务逻辑,写具体的小功能(添加,查询)每个功能写为一个方法,提供给Service调用.

Session放在Service层管理,不放在DAO层.
0 请登录后投票
   发表时间:2008-01-15  
不知道大家对于OO编程中的依赖倒置这条原则的见解如何,从我个人的观点来看,良好的分层体系为实现这种依赖倒置也提供了方便之处,依赖倒置为解除之间的高耦合提供了方案。在系统中加入一个中间层,使你整个系统的架构更加灵活,更能快速高效优质地响应未知的变化,从而拥抱变化。
0 请登录后投票
   发表时间:2008-01-17  
有更好的选择,让你既抛开DAO,又能隔离hibernate.

http://pig345.iteye.com/blog/79822
0 请登录后投票
   发表时间:2008-01-17  
说实话,我觉得DAO和Services的存在就是为了把持久化层和业务层进行分离,软件开发的理想就是代码的无限重用,为什么实现代码的无限重用,一个好的方式就是写一些与具体框架没有关联的方法,这样如果不用这个框架的话,那些代码完全可以分离出来再去用在别的地方
0 请登录后投票
   发表时间:2008-01-17  
关于你说的那个session 的问题,你可以在spring 中指定,当程序进入action 的时候就开启session  ,我现在的项目就是这样用的  struts2+spring+hibernate
0 请登录后投票
   发表时间:2008-01-17  
bianqioujin 写道
关于你说的那个session 的问题,你可以在spring 中指定,当程序进入action 的时候就开启session  ,我现在的项目就是这样用的  struts2+spring+hibernate

如果当初struts不是 那么难以测试的话.人们为什么开发service层呢?
0 请登录后投票
   发表时间:2008-01-18  
要,我觉得肯定要。
Hibernate和Dao所扮演的角色是不同的。
Dao是项目的数据维护层,不可以用简单的Hibernate去替代。他所处理的并不单单只是数据库的数据。
0 请登录后投票
论坛首页 Java企业应用版

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