锁定老帖子 主题:hibernate在新项目上应用的弊端
该帖已经被评为隐藏帖
|
|
---|---|
作者 | 正文 |
发表时间:2011-04-26
项目用hibernate,有个人能够驾驭他就够了
|
|
返回顶楼 | |
发表时间: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,考虑了重复的情况 |
|
返回顶楼 | |
发表时间:2011-04-26
弱弱地问一下,lazy加载的问题 该如何解决? 我曾经听过一个多年的架构师用hibernate,遇到lazy加载的时候session关闭的问题,最后只好关掉lazy
|
|
返回顶楼 | |
发表时间:2011-04-26
2个都用过
说实在的,使用原生sql的hibernate的配置和ibatis没什么两样 为什么还有人说ibatis好于hibernate 另外,我不敢说hql可以完全替代原生sql,但是我至今为止用过的项目都可以用hql写查询语句,不过有些的确是很麻烦就是了。 |
|
返回顶楼 | |
发表时间:2011-04-26
不过我也同意遗留项目最好不要用hibernate
并且最好不要做级联,麻烦的很 延迟加载如果没有特别的要求,也最好是关掉 |
|
返回顶楼 | |
发表时间:2011-04-26
最后修改:2011-04-26
nishijia 写道
弱弱地问一下,lazy加载的问题 该如何解决? 我曾经听过一个多年的架构师用hibernate,遇到lazy加载的时候session关闭的问题,最后只好关掉lazy
使用OpenSessionInView这种反模式,等视图渲染完毕后可以自动关闭Session。在Web应用中,一般都是使用过滤器来实现的,这时候就要注意过滤器的配置顺序了,OpenSessionInView的过滤器一定要放在其它框架或是模板引擎的过滤器前面,以免页面还没开始渲染,Session就被过滤器自动关闭了。 |
|
返回顶楼 | |
发表时间:2011-04-26
同感,我现在只要是做新项目都用ibatis,早就抛弃hibernate了
|
|
返回顶楼 | |
发表时间:2011-04-26
fhx007 写道 同感,我现在只要是做新项目都用ibatis,早就抛弃hibernate了
终于有人敢替MyBatis说话了。 MyBatis这个小三,在ItEye被压制了n久,大家都不敢把它提到台面上啊。 |
|
返回顶楼 | |
发表时间:2011-04-26
nishijia 写道 弱弱地问一下,lazy加载的问题 该如何解决? 我曾经听过一个多年的架构师用hibernate,遇到lazy加载的时候session关闭的问题,最后只好关掉lazy
你那个问题应该是struts+hibernate集成的时候(或类似的框架集成),在控制器中关闭了hibernate的session,而后在页面中你又要迭代对象集合,结果对象集合中的A对象包含了B对象的实体在被访问的时候出现了session关闭的问题,不知是不是这样理解的?这个问题产生的根源其实你去想想程序执行的流程就可以了,用spring,用filter都可以解决这个问题。 |
|
返回顶楼 | |
发表时间: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 |
|
返回顶楼 | |