9
回答
使用Spring的HibernateTemplate后Dao是否需要
注册华为云得mate10,2.9折抢先购!>>>   

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

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

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

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

举报
艳沐石
发帖于5年前 9回/1K+阅
共有9个答案 最后回答: 3年前

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

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


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

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

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


所以。dao是必要的。

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

引用来自“Track3r”的答案

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

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


所以。dao是必要的。

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

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

引用来自“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层么,只是不同的实现方式而已。
DAO is dead....HibernateTemplate is too old, should be deprecated in new project , use native Hibernate API or JPA in your new project.

引用来自“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.

--- 共有 5 条评论 ---
hantsyIn a summary, use Hibernate Session or JPA EntityManager directly. 5年前 回复
hantsyThese 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. 5年前 回复
hantsy https://github.com/hantsy/spring-sandbox/tree/master/snippets/jpa 5年前 回复
hantsyI am writing some articles about Spring related technologies, it is on the way(not published in my blog now). 5年前 回复
hantsySpring 3 provides new glue codes for Hibernate 4, a new package named ~.hibernate4 provided. 5年前 回复
顶部