使用Spring的HibernateTemplate后Dao是否需要

艳沐石 发布于 2013/05/19 16:16
阅读 1K+
收藏 1

Spring在继承Hibernate的时候,提供了一个HibernateTemplate类,算是工具类吧,在这里,能够完成数据库的基本操作。

请问Dao和HibernateTemplate的关系是如何的呢?在项目中,我们应该如何来组织它们之间的关系。

-------------------------------

我个人认为,可以通过service,来提供外界操作一个领域模型的相互关联关系,而至于数据库操作,通过HibernateTemplate直接交互即可。因为Dao,我们也只是写一个基类+泛型,然后去写类继承它。

加载中
0
lxbzmy
lxbzmy

根据实际情况来,service还会存在相互调用的情况呢。

先写好service,随时重构整理吧。


艳沐石
艳沐石
回复 @lxbzmy : 避免service中重复调用service?比如,对于订单中获取商品的信息,那么,在订单中只需要找到这个货品,那么关于货品的所有信息就都可以拿到了的。当然这个需要是需要延长session的有效时间。
lxbzmy
lxbzmy
每个人负责一个领域的service和dao,先写service实现,如果其他service需要引用这个人的service中的方法,就提取出dao来。
lxbzmy
lxbzmy
service也是在分领域模型来处理业务逻辑的,不是吗?精心定义的service接口和良好的开发人员直接的交流,能保证你service层开发顺利。service里直接用hibernatetemplate也可以的。
艳沐石
艳沐石
是这样的,我希望的方式:对于每个模块有一个人维护这个领域模型的处理,而在业务处理中,通过调用service服务来完成,不关心数据之间的关系。
0
阿伏流
阿伏流

Dao中 调用实现HibernateTemplate,查询数据返回给service层,实现数据调用与业务的松耦合,Dao是三层必不可少的东西。

如果你说直接在service层调用hibernatetemplate的话,那你以后项目做大,要进行维护的时候,改数据调用,还得去改service层,这也好说,改就改吧,但是你想,你如果Aservice调用取所有用户的一个方法,Bservice也用了这个方法,你这两个service都要去修改,两个也好说,那要是100个,1000个呢。而如果你用dao层,一次调用,一次修改,做到了编程的 write once ,only once。


所以。dao是必要的。

艳沐石
艳沐石
您好,非常感谢你的指导。在你的评论中,很好的应用了提高代码复用性的思路。当然由于我的问题,没有描述出问题的重点。其实HibernateTemplate在实现Dao的一种思路上,它并没有采用类泛型,而是在方法上通过类型传递来对数据库信息操作。
0
james_you
james_you
dao是一种逻辑上的分法。hibernatetemplate本身也可以认为是dao的一种实现。
艳沐石
艳沐石
朋友,非常感谢您的回答。对于HibernateTemplate这种Dao设计,一个通用性模板方式。对于领域模型的处理,我觉得比较合适,但是对于普通jdbc单独表查询,并没有在数据模型中体现表之间关系的处理呢?
0
艳沐石
艳沐石

引用来自“Track3r”的答案

Dao中 调用实现HibernateTemplate,查询数据返回给service层,实现数据调用与业务的松耦合,Dao是三层必不可少的东西。

如果你说直接在service层调用hibernatetemplate的话,那你以后项目做大,要进行维护的时候,改数据调用,还得去改service层,这也好说,改就改吧,但是你想,你如果Aservice调用取所有用户的一个方法,Bservice也用了这个方法,你这两个service都要去修改,两个也好说,那要是100个,1000个呢。而如果你用dao层,一次调用,一次修改,做到了编程的 write once ,only once。


所以。dao是必要的。

当然,对于朋友的疑问,即多处直接使用HibernateTemplate,如果有一天希望更换持久层,会出现问题。其实,可以根据HibernateTemplate这种设计思路,创建一个Dao接口(或者采用Facade模式)将HibernateTemplate做一次包装,当需要换持久层,只需要再写一套实现即可。
0
阿伏流
阿伏流

引用来自“艳沐石”的答案

引用来自“Track3r”的答案

Dao中 调用实现HibernateTemplate,查询数据返回给service层,实现数据调用与业务的松耦合,Dao是三层必不可少的东西。

如果你说直接在service层调用hibernatetemplate的话,那你以后项目做大,要进行维护的时候,改数据调用,还得去改service层,这也好说,改就改吧,但是你想,你如果Aservice调用取所有用户的一个方法,Bservice也用了这个方法,你这两个service都要去修改,两个也好说,那要是100个,1000个呢。而如果你用dao层,一次调用,一次修改,做到了编程的 write once ,only once。


所以。dao是必要的。

当然,对于朋友的疑问,即多处直接使用HibernateTemplate,如果有一天希望更换持久层,会出现问题。其实,可以根据HibernateTemplate这种设计思路,创建一个Dao接口(或者采用Facade模式)将HibernateTemplate做一次包装,当需要换持久层,只需要再写一套实现即可。
你所谓的 “将HibernateTemplate做一次包装,当需要换持久层,只需要再写一套实现即可。” 其实不就是一个变相的Dao层么,只是不同的实现方式而已。
0
hantsy
hantsy
DAO is dead....HibernateTemplate is too old, should be deprecated in new project , use native Hibernate API or JPA in your new project.
0
艳沐石
艳沐石

引用来自“hantsy”的答案

DAO is dead....HibernateTemplate is too old, should be deprecated in new project , use native Hibernate API or JPA in your new project.

Thanks! If using native Hibernate API, how I can do manage the transaction.

Really, I don't want to use Hibernate because of the chain of Hibernate making me confuse.

hantsy
hantsy
In a summary, use Hibernate Session or JPA EntityManager directly.
hantsy
hantsy
These codes included JPA and Hibernate 4 usage in Spring 3, which are configured in Spring way, but all APIs are based on JPA/Hibernate native API, of course, Spring transaction is also supported.
hantsy
hantsy
https://github.com/hantsy/spring-sandbox/tree/master/snippets/jpa
hantsy
hantsy
I am writing some articles about Spring related technologies, it is on the way(not published in my blog now).
hantsy
hantsy
Spring 3 provides new glue codes for Hibernate 4, a new package named ~.hibernate4 provided.
0
王瑞平
王瑞平

DAO是可以完全不用的

但你这样做下去那个公司用你?

艳沐石
艳沐石
朋友,谢谢你的提醒~
0
陈文锦的秘密
陈文锦的秘密
dao=data access object
返回顶部
顶部