十一、Hibernate查询优化之策略设置

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/mChenys/article/details/84792472

使用Hibernate查询一个对象的时候,查询其关联对象.应该如何查询,可以通过配置映射文件的属性来设置。
lazy属性:
解决查询的时机的问题,是否延迟加载关联数据,例如下面2条语句:

Customer c1 = (Customer) session.get(Customer.class, 1);
System.out.println(c1.getLinkmans().size());

lazy的默认属性是true,即执行第一条语句的时候,不会执行sql语句去查询其关联的表的数据,它只会查询当前表的数据,当执行到第二条语句的时候才会执行sql语句去查询其关联表的数据.

fetch属性
用于解决查询的语句用何种形式来执行,例如select 语句,join语句,子查询语句等等.

在set标签上配置策略

lazy和fetch属性可以配置在set标签上, 可以在一对多的一方和多对多的任何一方的set标签上进行设置.
下面介绍下这2个属性的取值及其含义:

lazy的取值 控制是否延迟查找关联对象
true 默认值,延迟
false 不延迟
extra 及其懒惰,只查询关联条件的内容,关联对象的其他字段不查询,只有单独用到这些字段才会再次查询
fetch的取值 控制SQL语句生成的格式
select 默认值,发送select查询语句
join 连接查询.发送的是一条迫切左外连接,如果配置了join,那么lazy属性就失效了
subselect 子查询.发送一条子查询查询其关联对象.(需要使用list()方法进行测试)

Hibernate框架都采用了默认值,开发中基本上使用的都是默认值。特殊的情况按需求而定。

在man-to-one标签上配置策略

<many-to-one>标签上使用fetch和lazy属性只会出现在一对多的多方映射文件中。具体取值和含义如下:

lazy的取值 控制是否延迟查找关联对象
false 不延迟
proxy 默认值,是否延迟是由另一端的<class>上的lazy属性确定.

说明:如果另一端的<class>上的lazy=”true”,那么proxy的值就是true(延迟加载);如果另一端的<class>上lazy=”false”,那么该proxy的值就是false(不采用延迟.)

fetch的取值 控制SQL语句生成的格式
select 默认值,发送select查询语句
join 连接查询.发送的是一条迫切左外连接,如果配置了join,那么lazy属性就失效了

猜你喜欢

转载自blog.csdn.net/mChenys/article/details/84792472