论坛首页 Java企业应用论坛

hibernate在新项目上应用的弊端

浏览 42040 次
该帖已经被评为隐藏帖
作者 正文
   发表时间:2011-04-26  
项目用hibernate,有个人能够驾驭他就够了
0 请登录后投票
   发表时间:2011-04-26  
200cc 写道
mlw2000 写道
KimShen 写道

5,你来句SQL,只要你表设计是合理的我就能用HQL或者QBC帮你写出来.写不出来十有八九是数据表设计有问题

综上所述,你的感受大多数是因为你也不熟悉Hibernate.我不反对MyBatis,但是MyBatis还不如DBUtils和SpringJDBC Template

两个都不完全认同,我来举个例子:
t_student(id,name); -- 学生表
t_course(id,name); -- 课程表
t_score(id,student_id,course_id,score_value); -- 成绩表


给出SQL或HQL或QBC求出每门课前十名的学生记录?


用sql写这个比较顺手.我只会oracle - -.
SELECT * FROM (
SELECT A.*, ROW_NUMBER() OVER(PARTITION BY CID ORDER BY VAULE DESC) RANK
  FROM (SELECT X.*, S.NAME SNAME, C.NAME CNAME
          FROM A_STUDENT S, A_COURSE C, A_SCORE X
         WHERE X.SID = S.ID
           AND X.CID = C.ID) A )WHERE rank<=10

+1,考虑了重复的情况
0 请登录后投票
   发表时间:2011-04-26  
弱弱地问一下,lazy加载的问题 该如何解决? 我曾经听过一个多年的架构师用hibernate,遇到lazy加载的时候session关闭的问题,最后只好关掉lazy
0 请登录后投票
   发表时间:2011-04-26  
2个都用过
说实在的,使用原生sql的hibernate的配置和ibatis没什么两样
为什么还有人说ibatis好于hibernate

另外,我不敢说hql可以完全替代原生sql,但是我至今为止用过的项目都可以用hql写查询语句,不过有些的确是很麻烦就是了。
0 请登录后投票
   发表时间:2011-04-26  
不过我也同意遗留项目最好不要用hibernate
并且最好不要做级联,麻烦的很
延迟加载如果没有特别的要求,也最好是关掉

0 请登录后投票
   发表时间:2011-04-26   最后修改:2011-04-26
nishijia 写道
弱弱地问一下,lazy加载的问题 该如何解决? 我曾经听过一个多年的架构师用hibernate,遇到lazy加载的时候session关闭的问题,最后只好关掉lazy

使用OpenSessionInView这种反模式,等视图渲染完毕后可以自动关闭Session。在Web应用中,一般都是使用过滤器来实现的,这时候就要注意过滤器的配置顺序了,OpenSessionInView的过滤器一定要放在其它框架或是模板引擎的过滤器前面,以免页面还没开始渲染,Session就被过滤器自动关闭了。

0 请登录后投票
   发表时间:2011-04-26  
同感,我现在只要是做新项目都用ibatis,早就抛弃hibernate了
0 请登录后投票
   发表时间:2011-04-26  
fhx007 写道
同感,我现在只要是做新项目都用ibatis,早就抛弃hibernate了

终于有人敢替MyBatis说话了。
MyBatis这个小三,在ItEye被压制了n久,大家都不敢把它提到台面上啊。
0 请登录后投票
   发表时间:2011-04-26  
nishijia 写道
弱弱地问一下,lazy加载的问题 该如何解决? 我曾经听过一个多年的架构师用hibernate,遇到lazy加载的时候session关闭的问题,最后只好关掉lazy

你那个问题应该是struts+hibernate集成的时候(或类似的框架集成),在控制器中关闭了hibernate的session,而后在页面中你又要迭代对象集合,结果对象集合中的A对象包含了B对象的实体在被访问的时候出现了session关闭的问题,不知是不是这样理解的?这个问题产生的根源其实你去想想程序执行的流程就可以了,用spring,用filter都可以解决这个问题。
0 请登录后投票
   发表时间:2011-04-26  
SELECT * FROM (
SELECT A.*, ROW_NUMBER() OVER(PARTITION BY CID ORDER BY VAULE DESC) RANK
  FROM (SELECT X.*, S.NAME SNAME, C.NAME CNAME
          FROM A_STUDENT S, A_COURSE C, A_SCORE X
         WHERE X.SID = S.ID
           AND X.CID = C.ID) A )WHERE rank<=10

根据这个改成hql应该是:

SELECT new Student(id,name) from (select A.sname name,A.id id,ROW_NUMBER() OVER(PARTITION BY CID ORDER BY VAULE DESC) RANK
  FROM (SELECT X.*, S.NAME SNAME, C.NAME CNAME
          FROM tStudent S, tCourse C, tScore X
         WHERE X.SID = S.ID
           AND X.CID = C.ID) A )WHERE rank<=10
0 请登录后投票
论坛首页 Java企业应用版

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