`
tczengjin
  • 浏览: 12878 次
  • 来自: ...
社区版块
存档分类
最新评论

有了hibernate是否还需要Dao?

阅读更多
最近学习使用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 一般情况的项目是不是这样分层更好一些呢?
分享到:
评论
9 楼 qmy 2007-12-22  
先谢谢tczengjin的回复

我再想了想之前用JDBC时的DAO所做的工作,只是封装了SQL语句。
比如DAO有个insert(User)的方法,封装的是insert into t_user values(?,?,?.....)的操作,Service只要调用DAO的这个insert方法就好了。

可是Hibernate提供了save(user)这样的方法,已经封装了SQL语句,也就是说它已经实现了DAO的功能,没必要再写DAO了。如果为了解耦合,只有写一个Hibernate提供的这些api的抽象,然后如果想切换到JDBC,就另外写一个譬如JDBC的DAO实现。

还是我的菜菜的理解……望指点
8 楼 tczengjin 2007-12-22  
xuejianshan 写道
偶也正在学习之中,如果你在看看spring我想你会恍然大悟的。
但是当你学习这方面的东西时,头脑里必须有一个概念---面象接口编程。
具体它为什么这样分,当然会有它的道理,如果你还是不明白的话,那只能说你对它的思想还不够深入,我建议多读代码,和别人讨论一下。
我其实还是懂一点spring的,能够理解面向接口编程。如果说Dao接口可以不让降低我们对数据库访问接口的依赖,Service接口主要可以降低我们对于什么的依赖呢?如果大家略举一例,不胜感激!!!另外我目前写的程序与Hibernate耦合并没有关系,在这样的情况下,大家认为省去Dao是不是一个更好的选择,我一开始就不介意与Hibernate偶和,故均没有写Service接口和Dao接口,但写了Service 和 Dao的一个具体的实现(出于自己一想简化开发省了接口,又惯性使然写了这两个层),请问在这样的情况,大家能否给个建议,Service和Dao的取舍问题,谢谢!
7 楼 tczengjin 2007-12-22  
qmy 写道

现在我有一个ListWeblogAction,是用来列出指定的用户的所有日志的Action,首先遇到的问题就是这个Action调用的方法应该写在UserService里呢?还是写在WeblogService里?如果写在UserService里,调用的时候直接在方法里写一句user.getWeblogs()返回一个Set,那这个系统的持久层不是非用ORM(或者说非用hibernate)不可了?如果写在WeblogService里,那就得通过userid来查询指定用户的所有日志,这样好像又失去了使用ORM的意义。

第二个问题是这时候Action传给Service层的参数应该是一个UserID还是整个User对象?(这问题好像可以随着第一个问题的解决而解决)

还有,从上面的分析里,我感觉一个使用了ORM的系统好像就不能脱离ORM而改用JDBC了,因为一个系统如果使用了ORM,它的业务层的设计和不使用ORM的系统的业务层设计是不一样的。

关于这个问题说说我的想法吧,我认为写到UserService中比较好,因为我写程序首先会画用例图,这里应该有个User的用例它有很多操作比如ListWeblogAction,然后我会根据具体的操作也就是业务逻辑,在找出其中涉及到的实体比如Weblog。还有一点是“通过userid来查询指定用户的所有日志”我认为你的这个操作可以分为两步,首先通过userid找到user然后通过user找Weblog,操作分的越细越有利于以后的重用,比如如果你有一个需求是找userid对应的user的业务呢,那么你又得去写个方法了。但是像我这样写系统的时候操作分的细了,感觉service被我架空的感觉,有点矛盾。我现在在想通过userid找user和通过user找Weblog应该是UserDao的事情,然后两个方法写到一个UserService方法中去,这样UserService是不是感觉干了点活呢???但是如果我又有一个业务是通过userid找user呢???把两个方法合成一个业务逻辑到底放到Action里去,UserService在Action中调用这两个方法还是两个方法写到UserService中的一个方法中去在Action里,UserSercie仅仅调用这一个方法就可以了,有点矛盾,那样好点呢???个人倾向于第一种,但是UserService的方法就变成了重复掉UserDao的方法了
6 楼 tczengjin 2007-12-22  
抛出异常的爱 写道
管理方便 ,找文件不用debug
仅此而已吗?能稍微详细点吗?另外看过你在javaeye上的回帖,一般回的第一帖精简的很,如果不是我继续看你以后的回帖,恐怕偶目前还理解不了其中的深意 另外我这样dao每个方法打开session进行一次crud操作后关闭,那Session的缓存基本上利用不上了是不???
5 楼 tczengjin 2007-12-22  
moonranger 写道
我觉得设计DAO的重要原因是为了将持久化的实现与持久化接口分开。万一哪天你不用Hibernate了,DAO的接口还可以重用。而如果你直接使用Hibernate的话,你的业务逻辑层代码就和Hibernate耦合了。
这只是我肤浅的理解而已,呵呵~
感谢你的回答,那用Jpa后是不是不写Dao就可以解决Hibernate耦合的问题了呢?(我认为可以)。另外主要我认为写了Dao后Hibernate的Session缓存的作用大大被削弱了,因为我Dao的每一个方法只进行一次crud操作开个一次Session又马上close掉了。
4 楼 qmy 2007-12-22  
天,我和楼主遇到的问题一模一样,我对分层的认识好像也和楼主差不多:
一个action只针对用户的一步操作
感觉我的service里仅仅只是重复调用了一遍dao的方法

我举个例子来说吧:
我在写一个blog系统,有用户模块、有日志模块、有相册模块、有留言板模块。日志模块有三张表:日志分类表,日志表,日志评论表。

现在我有一个ListWeblogAction,是用来列出指定的用户的所有日志的Action,首先遇到的问题就是这个Action调用的方法应该写在UserService里呢?还是写在WeblogService里?如果写在UserService里,调用的时候直接在方法里写一句user.getWeblogs()返回一个Set,那这个系统的持久层不是非用ORM(或者说非用hibernate)不可了?如果写在WeblogService里,那就得通过userid来查询指定用户的所有日志,这样好像又失去了使用ORM的意义。

第二个问题是这时候Action传给Service层的参数应该是一个UserID还是整个User对象?(这问题好像可以随着第一个问题的解决而解决)

第三个问题就是楼主问的DAO需要不需要的问题了,如果我用UserPO作参数,调用的listWeblog方法在UserService里,那UserService调用的DAO又该做些什么动作呢?好像没有使用DAO的必要了吧?想像一下,我进入某个用户的blog,然后点击导航栏上的“日志”链接,接下来就要显示这个用户的所有日志了,先把这个Detached的UserPO传给UserService,然后在UserService里lock这个UserPO,再调用UserPO的getWeblogs()方法返回指定用户的所有日志集合不就完了,DAO还要做什么?或者把这些操作放在DAO里,那Service又做什么?不是没事可干?就像楼主说的仅仅是把UserPO从Action传到了DAO而已。

还有,从上面的分析里,我感觉一个使用了ORM的系统好像就不能脱离ORM而改用JDBC了,因为一个系统如果使用了ORM,它的业务层的设计和不使用ORM的系统的业务层设计是不一样的。

不知道我说的对不对,我是个初学者,还请各位前辈多多指点!
3 楼 xuejianshan 2007-12-22  
偶也正在学习之中,如果你在看看spring我想你会恍然大悟的。
但是当你学习这方面的东西时,头脑里必须有一个概念---面象接口编程。
具体它为什么这样分,当然会有它的道理,如果你还是不明白的话,那只能说你对它的思想还不够深入,我建议多读代码,和别人讨论一下。
2 楼 抛出异常的爱 2007-12-22  
管理方便 ,找文件不用debug
1 楼 moonranger 2007-12-22  
我觉得设计DAO的重要原因是为了将持久化的实现与持久化接口分开。万一哪天你不用Hibernate了,DAO的接口还可以重用。而如果你直接使用Hibernate的话,你的业务逻辑层代码就和Hibernate耦合了。
这只是我肤浅的理解而已,呵呵~

相关推荐

    myeclipse中自动生成hibernate的POJO、DAO和hbm.xml文件

    为了使用MyEclipse生成Hibernate的POJO、DAO和hbm.xml文件,首先需要配置数据库连接。在MyEclipse中,可以通过Database Explorer窗口来配置数据库连接。具体步骤如下: 1. 打开Database Explorer窗口:window->open...

    Hibernate 原生通用DAO

    5. **缓存支持**:Hibernate提供了第一级缓存和第二级缓存,通用DAO可以根据需求选择是否开启和配置缓存,提高数据读取速度。 6. **实体转换**:将数据库查询结果转化为对应的Java对象,通常是通过`Session.load()`...

    hibernate eclipse插件生成dao样例

    标题中的“hibernate eclipse插件生成DAO样例”指的是使用Eclipse集成开发环境中的Hibernate插件自动生成数据访问对象(DAO)的示例。在Java应用程序开发中,尤其是使用Hibernate作为持久层框架时,DAO层是至关重要...

    Hibernate封装dao层

    在DAO层捕获和处理Hibernate抛出的异常,如`HibernateException`,并根据业务需求决定是否向上层抛出或转换为自定义异常。 8. **单元测试**: 对DAO层进行充分的单元测试,验证其功能的正确性,可以使用JUnit和...

    hibernate dao 生成工具

    Hibernate DAO(Data Access Object)生成工具是用于自动化创建数据访问层对象的实用程序,它可以显著提高开发效率,尤其是在处理大量数据库交互的项目中。DAO模式是一种设计模式,它提供了对数据库操作的抽象,使得...

    Hibernate的通用dao

    综上所述,Hibernate的通用DAO设计模式是提高开发效率、降低维护成本的有效手段,但需要注意适配项目需求,合理使用,以实现最佳的性能和可维护性。通过阅读给出的博客链接(https://lzkyo.iteye.com/blog/683285)...

    HibernateDao.java

    《深入解析HibernateDao.java》 在Java开发领域,Hibernate作为一款强大的对象关系映射(ORM)框架,极大地简化了数据库操作。本文将深入探讨`HibernateDao.java`这一关键组件,揭示其背后的原理与实践应用。 `...

    Hibernate中的DAO模式

    具体实现时,首先需要在数据库中创建带有分页参数的存储过程,如`GET_USERS_BY_PAGE`,接收两个参数:开始索引和页大小。然后在Hibernate的DAO类中,定义一个方法,如`getUsersByPage(int startIndex, int pageSize)...

    Hibernate泛型Dao

    在实际应用中,还需要理解JDBC(Java Database Connectivity)的基础知识,因为Hibernate是在JDBC之上建立的。此外,了解SQL语言也是必要的,虽然Hibernate可以自动生成SQL,但在某些复杂查询场景下,可能需要手动...

    hibernate spring通用dao

    spring集成hibernate通用dao,泛型,server都可以调用

    Hibernate_通用DAO模式,一个写好的dao层

    本资源“Hibernate_通用DAO模式”提供了一种适用于不同类型表单的DAO实现,基于SSH(Struts2、Spring、Hibernate)框架,特别强调简洁、易懂和高可移植性。 首先,SSH框架是Java Web开发中的经典组合,Struts2负责...

    hibernate4 通用dao,service

    标题中的“hibernate4 通用dao,service”指的是在Java开发中使用Hibernate框架实现的通用数据访问对象(DAO)和业务服务层(Service)。Hibernate是一个流行的对象关系映射(ORM)工具,它允许开发者使用面向对象的...

    HibernateDao 通用

    HibernateDao 是一种基于 Hibernate ORM(对象关系映射)框架的通用数据访问对象,它简化了对数据库的操作,提供了更高级别的抽象,使开发者能够更加专注于业务逻辑而不是底层的数据操作。在Java开发中,Hibernate...

    Hibernate 基于持久层框架的DAO模式应用

    在基于持久层框架的DAO(Data Access Object)模式应用中,Hibernate扮演着核心角色,使得业务逻辑和数据访问逻辑分离,提高了代码的可复用性和可维护性。 1. **DAO模式的理解** DAO模式是一种设计模式,它创建了...

    HibernateDao

    hibernateDao工具类

    JPA(hibernate) Dao 和 DaoSupport

    在实际项目中,我们还需要了解如何使用Spring Data JPA简化这一过程,并掌握如何实现分页查询以及处理查询结果。通过`DaoSupport`类,我们可以更好地组织和管理DAO实现,同时利用Spring框架提供的强大功能。

    Struts2+hibernate+spring整合泛型DAO

    在Struts2+Hibernate+Spring的集成中,泛型DAO扮演着重要的角色,它使得DAO层对所有实体类的操作变得统一和规范。 首先,让我们详细了解一下Struts2。Struts2是基于拦截器的MVC框架,它提供了强大的动作映射、结果...

    使用代理实现Hibernate Dao层自动事务

    本文将深入探讨如何使用代理来实现Hibernate Dao层的自动事务管理,以提高代码的可维护性和事务处理的效率。 首先,理解Dao(Data Access Object)层的作用至关重要。Dao层是应用与数据库之间的一层抽象,它封装了...

    HibernateDAO的写法

    《深入理解HibernateDAO的写法》 在Java企业级开发中,Hibernate作为一款强大的对象关系映射(ORM)框架,极大地简化了数据库操作。而HibernateDAO则是基于Hibernate进行数据访问的对象,是业务逻辑层和持久层之间...

Global site tag (gtag.js) - Google Analytics