用户登录
用户注册

分享至

hibernate 不 关联查询

  • 作者: __森津幷
  • 来源: 51数据库
  • 2021-01-29
实际项目开发时,选择一个工具,有如下考量:

是否能够解决实际问题;对于 Hibernate 来说,完成实体和表之间的映射,是其主要功能,其他功能都可以按需选择,并不是说,这个工具有什么功能,就都必须用上,工具的使用向来都是跟着问题走的。
时间成本;面对紧张的时间安排,如果项目组所有成员都要学习 Hibernate 到精通,显然是很浪费时间的,而且 Hibernate 也不是看看视频看看书就可以看到实际运用场景的,实际开发中,很多使用 Hibernate 一两年的人也不是很清楚该怎么使用它提供的高级功能,也没时间和心思去翻官方 manual,那么,大家就会想:这个工具大家都不是很熟练,也没有十足的把握用好,那就只能把它最基本的功能用好算了,也就是,撇开那些高级特性,先用基本功能把活干了再说。
性能;Hibernate 的性能一直饱受诟病,通用工具都难免此类问题,实体加的关联多了,数据加载的就慢,再者,Hibernate 最擅长的并非查询,而是写操作,毕竟是全字段查询,相对来说,JdbcTemplate 就可以指定查询具体哪些字段,自己指定的关联查询 SQL 也比 Hibernate 生成的 SQL 高效简洁,让 JdbcTemplate 负责查询,Hibernate 负责写入,是个不错的搭配。
可维护性;实体关联需要维护,还得控制数据的加载时机(懒加载)、单/双向关系、级联以及抓取策略等,稍微配置不当,就会出现异常,这样的话,与其使用高级功能带来这么多问题,索性干脆不用,省得以后麻烦。
依赖性;项目开发要以数据为核心,数据库修改要灵活轻便,而不依赖于上层工具(如 Hibernate),如果实体添加了太多关联,日后使用其他映射工具或者修改数据库,这些实体就出现问题了,需要对应的修改,毕竟,不是所有工具都像 Hibernate 一样站在对象的角度思考问题的,例如:JOOQ 就提倡 SQL 的使用,反对所有操作都使用 ORM。



  一、 hibernate简介hibernate是一个jdo工具。它的工作原理是通过文件(一般有两种:xml文件和properties文件)把值对象和数据库表之间建立起一个映射关系。这样,我们只需要通过操作这些值对象和hibernate提供的一些基本类,就可以达到使用数据库的目的。例如,使用hibernate的查询,可以直接返回包含某个值对象的列表(list),而不必向传统的jdbc访问方式一样把结果集的数据逐个装载到一个值对象中,为编码工作节约了大量的时间。hibernate提供的hql是一种类sql语言,它和ejbql一样都是提供对象化的数据库查询方式,但hql在功能和使用方式上都非常接近于标准的sql. 二、 hibernate与jdbc的区别hibernate与jdbc的主要区别如下: 1、 hibernate是jdbc的轻量级的对象封装,它是一个独立的对象持久层框架,和app server,和ejb没有什么必然的联系。hibernate可以用在任何jdbc可以使用的场合,从某种意义上来说,hibernate在任何场合下取代jdbc. 2、 hibernate是一个和jdbc密切关联的框架,所以hibernate的兼容性和jdbc驱动,和数据库都有一定的关系,但是和使用它的java程序,和app server没有任何关系,也不存在兼容性问题。 3、 hibernate是做为jdbc的替代者出现的,不能用来直接和entity bean做对比。 三、 hibernate 进行多表关联查询hibernate对多个表进行查询时,查询结果是多个表的笛卡尔积,或者称为“交叉”连接。 例如:from student, book from student as stu, book as boo from student stu, book boo注意:让查询中的student和book均是表student和book对应的类名,它的名字一定要和类的名字相同,包括字母的大小写。别名应该服从首字母小写的规则是一个好习惯,这和java对局部变量的命名规范是一致的。 下面列举一个完整的例子来说明hibernate对多个表进行关联查询(其中粗体是我们要特别注意的地方,相应表tbookinfo和bookselection的结构和其对应的hbm.xml、class文件就不一一列举了,有需要详细了解的朋友,请联系我): string stest = "from tbookinfo book, bookselection sel where book.id = sel.bookid"; collection result = new arraylist(); transaction tx = null; try { session session = hibernateutil.currentsession(); tx = session.begintransaction(); query query = session.createquery(sql); result = query.list(); tx.commit(); } catch (exception e) { throw e; } finally { hibernateutil.closesession(); } //result list为object[] 的集合{{object[] } ,{object[] } ,{object[] } } //object[] :{tbookinfo ,bookselection }与查询语句的顺序有关 arraylist slist = (arraylist) result; iterator iterator1 = slist.iterator(); while (iterator1.hasnext()) { object[] o = (object[]) iterator1.next(); ookinfo bookinfo = (tbookinfo) o[0]; bookselection bookselect = (bookselection) o[1]; system.out.println("bookinfo-title: " bookinfo.gettitle()); system.out.println("bookselection-bookselectionid: " bookselect.getid()); }
软件
前端设计
程序设计
Java相关