论坛首页 入门技术论坛

在Hibernate中使用HibernateTemplate的三种方法

浏览 9784 次
该帖已经被评为新手帖
作者 正文
   发表时间:2010-04-20   最后修改:2010-04-20
ORM工具在简化单表动态查询和CRUD的时候作用很大
但是复杂查询用HQL之类的那就太过于麻烦了,还不如直接写SQL
至于一个业务逻辑里十几次操作数据库,这往往直接就写成存储过程了
0 请登录后投票
   发表时间:2010-04-20  
ysihaoy 写道
slaser 写道
aaa5131421 写道
downpour 写道
aaa5131421 写道

正解,好多的书籍,视频都是这样、那样说,持久化一定需要分出个层来,然后很多人就以为非要自己写个dao代码,才算分个层出来,这样才解耦,殊不知hibernateDaoSupport就已经是一个dao层,在大部分并不是十分十分复杂的项目中,将hibernate再封装一下,给services使用,而每个dao方法里面却只有一行的代码。写方法头的代码和方法体的代码一样多,美名其曰这叫封装。。。。我很无语。。。


你的理解是错的。

DAO这层可以很薄,但是要有。把SQL和HQL写在配置文件里是一个非常差的实践。会为调试和问题定位带来极大的麻烦。

如果我不是需要经常再不改动代码的情况下改动hql的需求,我会直接放在业务逻辑类里面。这是最理想的位置
谁说hql是属于dao层的呢?hql是属于业务逻辑的,它经hibernate转换后成变成的sql才属于dao层里面的东西。而hibernate的这个转化过程就是你在“调用dao层”
我不会直接写sql的,这违背hibernate本意,如果hql等。。实在满足不了需求,写sql是必然,但一个项目中这样的位置不会超过两处,这是技术上的问题,如果非要为这两处封装一个dao,得不偿失,假如需要写很多hql满足不了的sql,也可以考虑自己写个补充hibernate的hql解释器,而不是直接写sql并将他放在代码里面。

hql确实是业务层的东西,这个应该写在service里面,必须的sql放配置没什么问题,这个比放代码里面更干净,更容易调试。dao是jdbc时代遗留产物,不过为每一个sql的执行和把执行结果放入对象这样的操作做一个命名而已。在使用hibernate,jpa同时大量使用dao,才是一个很差的实践。所谓很薄的dao,为什么不直接用session或者jpa里面的entityManager代替,封装一下减少功能很有意思么?


这个不是绝对的,还应该具体问题具体分析吧。
如果系统比较复杂庞大,并且以后有换数据库的可能性,还是写一个dao层对日后是有好处的。
如果只是一般的系统并且数据库不会换掉可以考虑写一个自己的BaseDao。

我是基于不换数据库,不换orm工具来说的。没有限定条件,一切都是空谈。
0 请登录后投票
   发表时间:2010-04-20  
downpour 写道
你认为DAO没有存在的必要性,主要是因为你做的项目还不够复杂。

在一个Service调用中,业务逻辑可能会包含十几次的数据库调用,其中有一半需要用HQL。你告诉我你把这些HQL全部写在Service层,那么你的Service层就会膨胀不堪,代码就会变得不可读。DAO层的出现,可以把这些HQL的数据库调用封装起来,让你的代码更加简洁。同时,这些被封装的函数,可以被反复调用。

HQL或者SQL写在配置文件里面是一种非常错误的做法。项目很大的时候,你会发现你的配置文件中充斥着非常类似的HQL或者SQL。同时,在你进行debug调试的时候,由于你拿到的是一个Key,增加了一个根据Key到配置文件去拿HQL的动作,从而给调试带来不便。

没看出来根据key拿hql那里麻烦了,除非key和对应的query命名非常混乱。如果合理运用named query,java代码和hql/sql相分离,将会大大减低维护工作的难度,拿sql来说,你说DBA喜欢看你java中拼出来的sql,还是单独配置文件中的sql?同样作为java程序员的我,在view代码的时候,看到一大串sql进来插入java中,我也非常无语。
0 请登录后投票
   发表时间:2010-04-20  
aws 写道
ORM工具在简化单表动态查询和CRUD的时候作用很大
但是复杂查询用HQL之类的那就太过于麻烦了,还不如直接写SQL
至于一个业务逻辑里十几次操作数据库,这往往直接就写成存储过程了

对于很多遗留系统或者说设计时不是很考虑orm工具特性的系统,视图,存储过程等是不二法宝。处理非OO数据,java该歇一边去。
0 请登录后投票
   发表时间:2010-06-13  
slaser 写道
whaosoft 写道
star022 写道
这年头 还这么多人玩DAO啊~~!

为什么不玩DAO了啊?

DAO没什么意义。
1.我只用hibernate。
2.我不换数据库。
3.sql和hql大部分写配置文件里面。
如此为什么不直接把session注入到service里面直接操作?



ession注入到service里面直接操作????
0 请登录后投票
论坛首页 入门技术版

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