Hibernate数据加载方式
2012-03-13 14:44
274 查看
Hibernate数据加载方式:
1、即时加载(Immediate Loading)
当实体加载完成后,立即加载与实体相关联的数据。即当实体加载完成后,Hibernate自动立即读取与实体相关联的数据,并且填充到实体对应的属性中。这种加载通常有多条select语句,即select实体数据后,同时select实体相关联的数据。
2、延迟加载(Lazy Loading)
实体加载时,其关联数据并不是立即读取,而是当关联数据第一次被访问时再进行读取,这种加载方式在第一次访问关联数据时,必须在同一个session中,否则会报session已关闭错误。
延迟加载通过在实体的hbm文件中的对应属性中设定lazy="true"实现。Hibernate3默认的加载方式是延迟加载。即默认lazy="true",主要用于one-to-many场合。
3、预先加载(Eager Loading)
预先加载时,实体及关联对象同时读取,与即时加载类似,但是预先加载是使用"outer-join"通过一条select语句同时读取。
注意:当实体间关联比较复杂时,比如多层关联,Hibernate生成的"outer join SQL"可能过于复杂,此时可以通过设定全局变量(hibernate.max_fetch_depth)限定join的层次(一般设定为5层)。
4、批量加载(Batch Loading)
对于即时和延迟加载,可以采用批量加载进行优化。
批量加载就是通过批量提交多个限定条件,一次多个限定条件的数据读取。同时在实体映射文件中的class节点,通过配置"batch-size"参数打开批量加载机制,并限定每次批量加载数据的数量,一般来说该值<10较合理.
比如:
select * from test where id=1;
select * from test where id=2;
我们可以整合成一条语句:
select * from test where id=1 ro id=2;
这就是所谓的批量加载机制
hibernate中lazy的使用
1、即时加载(Immediate Loading)
当实体加载完成后,立即加载与实体相关联的数据。即当实体加载完成后,Hibernate自动立即读取与实体相关联的数据,并且填充到实体对应的属性中。这种加载通常有多条select语句,即select实体数据后,同时select实体相关联的数据。
2、延迟加载(Lazy Loading)
实体加载时,其关联数据并不是立即读取,而是当关联数据第一次被访问时再进行读取,这种加载方式在第一次访问关联数据时,必须在同一个session中,否则会报session已关闭错误。
延迟加载通过在实体的hbm文件中的对应属性中设定lazy="true"实现。Hibernate3默认的加载方式是延迟加载。即默认lazy="true",主要用于one-to-many场合。
3、预先加载(Eager Loading)
预先加载时,实体及关联对象同时读取,与即时加载类似,但是预先加载是使用"outer-join"通过一条select语句同时读取。
注意:当实体间关联比较复杂时,比如多层关联,Hibernate生成的"outer join SQL"可能过于复杂,此时可以通过设定全局变量(hibernate.max_fetch_depth)限定join的层次(一般设定为5层)。
4、批量加载(Batch Loading)
对于即时和延迟加载,可以采用批量加载进行优化。
批量加载就是通过批量提交多个限定条件,一次多个限定条件的数据读取。同时在实体映射文件中的class节点,通过配置"batch-size"参数打开批量加载机制,并限定每次批量加载数据的数量,一般来说该值<10较合理.
比如:
select * from test where id=1;
select * from test where id=2;
我们可以整合成一条语句:
select * from test where id=1 ro id=2;
这就是所谓的批量加载机制
hibernate中lazy的使用
lazy,延迟加载 Lazy的有效期:只有在session打开的时候才有效;session关闭后lazy就没效了。 lazy策略可以用在: * <class>标签上:可以取值true/false * <property>标签上,可以取值true/false,这个特性需要类增强 * <set>/<list>等集合上,可以取值为true/false/extra * <one-to-one>/<many-to-one>等标签上,可以取值false/proxy/no-proxy 6.1 get和load的区别: * get不支持延迟加载,而load支持。 * 当查询特定的数据库中不存在的数据时,get会返回null,而load则抛出异常。 6.2 类(Class)的延迟加载: * 设置<class>标签中的lazy="true",或是保持默认(即不配置lazy属性) * 如果lazy的属性值为true,那么在使用load方法加载数据时,只有确实用到数据的时候才会发出sql语句;这样有可能减少系统的开销。 * //不会发出查询sql System.out.println("group id=" + group.getId()); 这里有一个问题,为什么加载主键的时候不需要发出sql语句。 6.3 集合(collection)的延迟加载:可以取值true,false,extra * 保持集合上的lazy的默认值,此时的效果和lazy="extra"是基本一样的。 * 设置集合上的lazy=extra,此时的效果和lazy属性的默认值是基本一样的。但是推荐使用这个属性值,因为在统计时这种情况显得比较智能。当然延迟是有效果的。 * 设置集合上的lazy=false true:默认取值,它的意思是只有在调用这个集合获取里面的元素对象时,才发出查询语句,加载其集合元素的数据 false:取消懒加载特性,即在加载对象的同时,就发出第二条查询语句加载其关联集合的数据 extra:一种比较聪明的懒加载策略,即调用集合的size/contains等方法的时候,hibernate 并不会去加载整个集合的数据,而是发出一条聪明的SQL语句,以便获得需要的值,只有在真正需要用到这些集合元素对象数据的时候,才去发出查询语句加载所有对象的数据 6.4 Hibernate单端关联懒加载策略:即在<one-to-one>/<many-to-one>标签上可以配置 懒加载策略。可以取值为:false/proxy/no-proxy false:取消懒加载策略,即在加载对象的同时,发出查询语句,加载其关联对象 proxy:这是hibernate对单端关联的默认懒加载策略,即只有在调用到其关联对象的方法的时候才真正发出查询语句查询其对象数据,其关联对象是代理类 no-proxy:这种懒加载特性需要对类进行增强,使用no-proxy,其关联对象不是代理类 注意:在class标签上配置的lazy属性不会影响到关联对象!!! |
相关文章推荐
- Hibernate的四种数据加载方式
- Hibernate两种加载数据的方式get()和load()
- hibernate数据加载方式
- Hibernate的四种种数据加载方式
- hibernate中数据加载方式
- Hibernate加载数据的两种方式
- Hibernate数据加载方式
- 浅谈Hibernate的四种种数据加载方式
- Hibernate数据加载方式
- Android通过AsyncTask与ThreadPool(线程池)两种方式异步加载大量数据的分析与对比
- Hibernate检索数据的五种方式
- table数据如何通过ajax方式加载?
- Spark-SQL从MySQL中加载数据以及将数据写入到mysql中(Spark Shell方式,Spark SQL程序)
- Hibernate中的五种数据检索方式
- spring加载hibernate映射文件的几种方式
- hibernate数据加载get/load的区别
- Hibernate获取数据方式与缓存使用
- Hive笔记二之数据类型,加载方式与hdfs对应关系
- 浅谈解决Hibernate懒加载的4种方式
- 利用索引器搞定了一个通用字典数据加载方式。