论坛首页 Java企业应用论坛

hibernate在新项目上应用的弊端

浏览 42140 次
该帖已经被评为隐藏帖
作者 正文
   发表时间:2011-04-26  
确实,hibernate对于新手来说,很容易犯错误。没有什么好与不好的技术,都是相对于而言的。
0 请登录后投票
   发表时间:2011-04-26  
hibernate要用在新的项目上,表结构要自己设计好(可控)。如果是遗留系统还是ibatis吧。
0 请登录后投票
   发表时间:2011-04-26  
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可以这样写,HQL不熟悉,不过我还是建议使用Hibernate,熟悉后应该很好用:

SELECT *
FROM T_SCORE T, (
SELECT MAX(SCORE_VALUE) MAX_SCORE, COURSE_ID
FROM T_SCORE
GROUP BY COURSE_ID
) TS
WHERE T.SCORE_VALUE = TS.MAX_SCORE
  AND T.COURSE_ID = TS.COURSE_ID
  AND ROWNUM <= 10   

  
0 请登录后投票
   发表时间:2011-04-26  
KimShen 写道
newslxw 写道

首先,我并不是一个hibernate开发的推崇者,也不精通hibernate,只是在某几个项目上用到了hibernate,下面是我的感受:
1、lazy加载,经常带来问题
2、级联保存常带来问题,所以我开发是都不用级联保存
3、主键的native要求主键使用number类型,给设计带来麻烦
4、很多人开发是不设计表结构,而是用hibernate来生产数据库,对维护带来很多影响
5、处理复杂SQL,还是需要用SQL而不能用HQL,导致语言混杂,增加维护成本
6、大数据量时,很容易出现问题
7、不适合新人使用,项目中往往有工作经验较低的人,使用hibernate往往容易出错

我对持久层框架要求很简单:
1、自动POJO到数据,或者数据库到POJO
2、适度缓存

如果不是项目要求,我更倾向选择ibatis。


1,没说要强制lazy
2,级联保存不代表数据库就是级联的.而且请举例问题?
3,我怎么不知道主键强制使用number,那你们是用什么?
4,正向工程和逆向工程是你自己选择的
5,你来句SQL,只要你表设计是合理的我就能用HQL或者QBC帮你写出来.写不出来十有八九是数据表设计有问题
6,大量是多少?我们查询40w条数据也没发现问题么?难道不用分页?
7,这个我认同

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

------------------------------------------------------------------
表一:用户登记表(USER_INFO)
引用

主键        用户名
userId    userName



表二:角色表(USER_ROLE)
引用

主键        角色名
roleCode  roleName



表三:用户-角色映射表(USER_ROLE_MAPPING)
引用

用户ID        角色ID
userId      roleCode



表四:权限表(USER_PERMISSION)
引用

权限ID            权限名称
permissionCode    permissionName



表五:角色权限映射表(ROLE_PERMISSION_MAPPING)
引用

角色ID            权限ID
roleCode         permissionCode


表五点二:用户权限直接映射表(USER_PERMISSION_MAPPING)
引用

用户ID            权限ID
userId            permissionCode



表六:产品订单表(PROD_ORDER)
引用

订单ID                 创建日期
orderId             lastUpdateTime



表七:产品登记表(PROD_PRODUCT)
引用

产品ID               产品名称      产品单价   折扣          实价
prodId              prodName    price     discount    actual_prices


表八:产品-产品订单映射表(PROD_PRODUCT_ORDER_MAPPING)
引用

产品ID               订单ID       购买数量             本类产品价格总计
prodId               orderId    prodQuantity      totalPrice


其他表:用户组表、订单分类表、产品分类表、订单流转记录表、部门表、职位表、用户部门映射表……

问题:
请查询角色编码是“salesman”,并且拥有“sellingCars”权限,本月销售奥迪A6产品超过100辆,且实际单价不低于50万的用户的前三十名。

上面这些表是我临时设计的,可能有些地方不合理,但是应该是普通软件中比较常见的应用情景,请问阁下如何使用Hibernate来实现上述查询?求教。
0 请登录后投票
   发表时间:2011-04-26  
KimShen 写道
newslxw 写道

首先,我并不是一个hibernate开发的推崇者,也不精通hibernate,只是在某几个项目上用到了hibernate,下面是我的感受:
1、lazy加载,经常带来问题
2、级联保存常带来问题,所以我开发是都不用级联保存
3、主键的native要求主键使用number类型,给设计带来麻烦
4、很多人开发是不设计表结构,而是用hibernate来生产数据库,对维护带来很多影响
5、处理复杂SQL,还是需要用SQL而不能用HQL,导致语言混杂,增加维护成本
6、大数据量时,很容易出现问题
7、不适合新人使用,项目中往往有工作经验较低的人,使用hibernate往往容易出错

我对持久层框架要求很简单:
1、自动POJO到数据,或者数据库到POJO
2、适度缓存

如果不是项目要求,我更倾向选择ibatis。


1,没说要强制lazy
2,级联保存不代表数据库就是级联的.而且请举例问题?
3,我怎么不知道主键强制使用number,那你们是用什么?
4,正向工程和逆向工程是你自己选择的
5,你来句SQL,只要你表设计是合理的我就能用HQL或者QBC帮你写出来.写不出来十有八九是数据表设计有问题
6,大量是多少?我们查询40w条数据也没发现问题么?难道不用分页?
7,这个我认同

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


恩,说的很有道理。补充下我的一些意见。
主键number不用,你可以用Assigned的嘛。
复杂sql查询还可以建视图去实现。
0 请登录后投票
   发表时间:2011-04-26  
EdwardWorld 写道
KimShen 写道
newslxw 写道

首先,我并不是一个hibernate开发的推崇者,也不精通hibernate,只是在某几个项目上用到了hibernate,下面是我的感受:
1、lazy加载,经常带来问题
2、级联保存常带来问题,所以我开发是都不用级联保存
3、主键的native要求主键使用number类型,给设计带来麻烦
4、很多人开发是不设计表结构,而是用hibernate来生产数据库,对维护带来很多影响
5、处理复杂SQL,还是需要用SQL而不能用HQL,导致语言混杂,增加维护成本
6、大数据量时,很容易出现问题
7、不适合新人使用,项目中往往有工作经验较低的人,使用hibernate往往容易出错

我对持久层框架要求很简单:
1、自动POJO到数据,或者数据库到POJO
2、适度缓存

如果不是项目要求,我更倾向选择ibatis。


1,没说要强制lazy
2,级联保存不代表数据库就是级联的.而且请举例问题?
3,我怎么不知道主键强制使用number,那你们是用什么?
4,正向工程和逆向工程是你自己选择的
5,你来句SQL,只要你表设计是合理的我就能用HQL或者QBC帮你写出来.写不出来十有八九是数据表设计有问题
6,大量是多少?我们查询40w条数据也没发现问题么?难道不用分页?
7,这个我认同

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

------------------------------------------------------------------
表一:用户登记表(USER_INFO)
引用

主键        用户名
userId    userName



表二:角色表(USER_ROLE)
引用

主键        角色名
roleCode  roleName



表三:用户-角色映射表(USER_ROLE_MAPPING)
引用

用户ID        角色ID
userId      roleCode



表四:权限表(USER_PERMISSION)
引用

权限ID            权限名称
permissionCode    permissionName



表五:角色权限映射表(ROLE_PERMISSION_MAPPING)
引用

角色ID            权限ID
roleCode         permissionCode


表五点二:用户权限直接映射表(USER_PERMISSION_MAPPING)
引用

用户ID            权限ID
userId            permissionCode



表六:产品订单表(PROD_ORDER)
引用

订单ID                 创建日期
orderId             lastUpdateTime



表七:产品登记表(PROD_PRODUCT)
引用

产品ID               产品名称      产品单价   折扣          实价
prodId              prodName    price     discount    actual_prices


表八:产品-产品订单映射表(PROD_PRODUCT_ORDER_MAPPING)
引用

产品ID               订单ID       购买数量             本类产品价格总计
prodId               orderId    prodQuantity      totalPrice


其他表:用户组表、订单分类表、产品分类表、订单流转记录表、部门表、职位表、用户部门映射表……

问题:
请查询角色编码是“salesman”,并且拥有“sellingCars”权限,本月销售奥迪A6产品超过100辆,且实际单价不低于50万的用户的前三十名。

上面这些表是我临时设计的,可能有些地方不合理,但是应该是普通软件中比较常见的应用情景,请问阁下如何使用Hibernate来实现上述查询?求教。


试试考虑下视图和Assigned。
0 请登录后投票
   发表时间:2011-04-26  
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
0 请登录后投票
   发表时间:2011-04-26   最后修改:2011-04-26
不知道为什么,发表回复时一下子提交了这么多,内容都一样。
0 请登录后投票
   发表时间:2011-04-26   最后修改:2011-04-26
不知道为什么,发表回复时一下子提交了这么多,内容都一样。
0 请登录后投票
   发表时间:2011-04-26   最后修改:2011-04-26
EdwardWorld 写道
EdwardWorld 写道
sheep3600 写道
EdwardWorld 写道
KimShen 写道
newslxw 写道

首先,我并不是一个hibernate开发的推崇者,也不精通hibernate,只是在某几个项目上用到了hibernate,下面是我的感受:
1、lazy加载,经常带来问题
2、级联保存常带来问题,所以我开发是都不用级联保存
3、主键的native要求主键使用number类型,给设计带来麻烦
4、很多人开发是不设计表结构,而是用hibernate来生产数据库,对维护带来很多影响
5、处理复杂SQL,还是需要用SQL而不能用HQL,导致语言混杂,增加维护成本
6、大数据量时,很容易出现问题
7、不适合新人使用,项目中往往有工作经验较低的人,使用hibernate往往容易出错

我对持久层框架要求很简单:
1、自动POJO到数据,或者数据库到POJO
2、适度缓存

如果不是项目要求,我更倾向选择ibatis。


1,没说要强制lazy
2,级联保存不代表数据库就是级联的.而且请举例问题?
3,我怎么不知道主键强制使用number,那你们是用什么?
4,正向工程和逆向工程是你自己选择的
5,你来句SQL,只要你表设计是合理的我就能用HQL或者QBC帮你写出来.写不出来十有八九是数据表设计有问题
6,大量是多少?我们查询40w条数据也没发现问题么?难道不用分页?
7,这个我认同

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

------------------------------------------------------------------
表一:用户登记表(USER_INFO)
引用

主键        用户名
userId    userName



表二:角色表(USER_ROLE)
引用

主键        角色名
roleCode  roleName



表三:用户-角色映射表(USER_ROLE_MAPPING)
引用

用户ID        角色ID
userId      roleCode



表四:权限表(USER_PERMISSION)
引用

权限ID            权限名称
permissionCode    permissionName



表五:角色权限映射表(ROLE_PERMISSION_MAPPING)
引用

角色ID            权限ID
roleCode         permissionCode


表五点二:用户权限直接映射表(USER_PERMISSION_MAPPING)
引用

用户ID            权限ID
userId            permissionCode



表六:产品订单表(PROD_ORDER)
引用

订单ID                 创建日期
orderId             lastUpdateTime



表七:产品登记表(PROD_PRODUCT)
引用

产品ID               产品名称      产品单价   折扣          实价
prodId              prodName    price     discount    actual_prices


表八:产品-产品订单映射表(PROD_PRODUCT_ORDER_MAPPING)
引用

产品ID               订单ID       购买数量             本类产品价格总计
prodId               orderId    prodQuantity      totalPrice


其他表:用户组表、订单分类表、产品分类表、订单流转记录表、部门表、职位表、用户部门映射表……

问题:
请查询角色编码是“salesman”,并且拥有“sellingCars”权限,本月销售奥迪A6产品超过100辆,且实际单价不低于50万的用户的前三十名。

上面这些表是我临时设计的,可能有些地方不合理,但是应该是普通软件中比较常见的应用情景,请问阁下如何使用Hibernate来实现上述查询?求教。


试试考虑下视图和Assigned。

很多涉及到数据库的应用,都不能完全使用Hibernate来但当持久层;但是所有的涉及到数据库的应用,都可以100%使用SQL(直接使用,或者自己封装,或者直接使用MyBatis)来实现,这就是问题所在。使用view,把所有的逻辑推迟到view中使用原生SQL来解决,这只能说明一个问题:Hibernate如果完全抛弃了原生SQL,只是个独臂大侠。
另外,如果查询是多条件组合查询,是用页面上的选择来合成的,你如何使用view,难道你打算动态生成view?


0 请登录后投票
论坛首页 Java企业应用版

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