Hibernate检索学习
Posted 敲出一个世界
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Hibernate检索学习相关的知识,希望对你有一定的参考价值。
Hibernate的检索策略:类级别的检索策略;1对多,多对多的检索策略;多对一,一对一的检索策略
1.类级别的检索策略,可以通过class元素的lazy属性来设置,该设置只对load方法有效果
2.1对多,多对多的检索策略(默认开启懒加载):通过set元素的三个属性来控制,查询1方带出n方:lazy定义多方集合初始化的时机;fetch定义查询多方时sql的形式(select/subselect),如果取值为join则定义多方集合初始化的时机,这个会覆盖lazy属性的值,即忽略lazy的设置;batch-size:检索发送sql语句的次数,提高效率
Lazy属性:通过设置lazy=false,将延长加载变为立即加载。一般不建议这么做,lazy除了可以设置true,false,还可以设置为extra(增强延迟加载),该值可以尽可能的 延迟集合初始化的时机。
当lazy设置为true(默认值,延迟加载),hibernate在以下情况初始化集合代理实例
1)程序第一次访问集合属性的iterator(),size(),isEmpty(),contains()等方法
2)通过Hibernate.initialize()静态方法显示初始化
· 当lazy设置为extra(增强延迟加载)时,Hibernate第一次访问集合的iterator()方法时会吃初始化集合代理实例,在调用集合的size(),isEmpty(),contains()方法 的时候并不会初始化集合代理实例,而是通过sql查询必要的信息
batch-size属性:通过设置batch-size通过改变发送的sql语句(加入in子句)从而来减少发送sql语句的次数:比如1方有4个,那么对于查询n方就要发送4条语句,如果设置了batch-size的值为2,那么查询的时候只会发送2条sql语句
fetch属性:该属性可以有select(默认),subselect,join三个值,当值 为select按照正常的方式来初始化set元素,如果设置为subselect,将通过子查询一次性初始化所有的set集合(而不是按照batch-size设置的那样),所以这个时候batch-size属性失效。具体的子查询的样子是将1方所有的oid查询出来的sql,作为查询n方in之后的语句即子查询从而一次性查询出所有的n方数据;如果设置为join,则决定set集合初始化的时机,即在加载1方对象的时候使用迫切左外连接(使用左外连接查询的时候同时把set集合初始化了)的方式检索n方的集合属性(这个时候就不是懒加载了),所以这个时候lazy属性失效。注意HQL查询的时候会忽略fetch=join 的取值
3.多对一,一对一的检索策略:通过设置many-to-one元素的相关属性来控制。查询n方法带出1方
Lazy属性:这里的lazy属性的取值和上面的不一样,为proxy(默认的表示使用延迟加载),和false(表示不适用延迟加载)。
fetch属性:设置为join时,同样会在查询n方式用迫切左外连接查询出1方集合的属性值(不再是延迟加载)这个时候同样会忽略lazy的设置
batch-size属性:这个时候该属性需要设置在1方的class属性上,才会起作用。比如利用hql查询出所有的n方数据,遍历n方集合查询出1方数据,如果查询1方数据需要3条语句,这个时候设置 batch-size=2,则只要发送2条sql语句即可。原理也是通过在添加in子句
以上是关于Hibernate检索学习的主要内容,如果未能解决你的问题,请参考以下文章
[原创]java WEB学习笔记89:Hibernate学习之路-- -Hibernate检索方式(5种),HQL介绍,实现功能,实现步骤,