检索策略

【hibernate系列】hibernate的n+1问题

一个人想着一个人 提交于 2019-12-01 20:00:05
什么叫n+1次select查询问题? 在Session的缓存中存放的是相互关联的对象图。默认情况下,当Hibernate从数据库中加载Customer对象时,会同时加载所有关联的Order对象。以Customer和Order类为例,假定ORDERS表的CUSTOMER_ID外键允许为null,图1列出了CUSTOMERS表和ORDERS表中的记录。 以下Session的find()方法用于到数据库中检索所有的Customer对象: List customerLists=session.find("from Customer as c"); 运行以上find()方法时,Hibernate将先查询CUSTOMERS表中所有的记录,然后根据每条记录的ID,到ORDERS表中查询有参照关系的记录,Hibernate将依次执行以下select语句: select * from CUSTOMERS; select * from ORDERS where CUSTOMER_ID=1; select * from ORDERS where CUSTOMER_ID=2; select * from ORDERS where CUSTOMER_ID=3; select * from ORDERS where CUSTOMER_ID=4; 通过以上5条select语句

Hibernate<六> Hibernate的检索策略

拜拜、爱过 提交于 2019-12-01 19:59:39
一、Hibernate检索策略 1、Hibernate提供了三种检索策略:立即检索策略、延迟检索策略(懒加载机制)、迫切左外连接检索策略。Hibernate在3.x以前lazy属性默认为false,Session的get()方法、load()方法默认都使用的是立即检索策略。从3.x以后,lazy属性为true,get()方法使用的是立即检索策略,load()方法默认使用的延迟检索策略。 以前默认的立即检索策略存在两大不足: ①、select语句的数据太多,需要频繁的访问数据库,会影响检索性能。如果需要检索查询n个Customer对象,那么必须执行n+1次select查询语句。这种检索策略没有利用sql的链接查询功能,例如,以上5条select语句完全可以通过以下一条select语句完成:select * from customer left outer join Orders on customers.id=orders.customer_id ②、在应用逻辑只需要访问Customer对象,而不需要访问Order对象的场合,加载Order对象完全是多余的操作,这些多余的Order对象白白浪费了许多内存空间。 而HIbernate提供的延迟检索策略能避免多余加载应用程序不需要访问的关联对象,迫切左外连接检索策略则充分利用了sql的外连接查询功能,能够减少select语句的数目。 2