当前位置:首页>开发>正文

什么是hibernate懒加载机制 hibernate 使用过滤器来解决懒加载的代码是什么原理

2023-04-24 15:58:38 互联网 未知 开发

 什么是hibernate懒加载机制 hibernate 使用过滤器来解决懒加载的代码是什么原理

什么是hibernate懒加载机制?

hibernate懒加载也叫延迟加载,是Hibernate3关联关系对象默认的加载方式,所谓延迟加载就是当在真正需要数据的时候,才真正执行数据加载操作。简单理解为,只有在使用的时候,才会发出sql语句进行查询。 延迟加载机制是为了避免一些无谓的性能开销而提出来的,在Hibernate中提供了对实体对象的延迟加载以及对集合的延迟加载,另外在Hibernate3中还提供了对属性的延迟加载。(延迟加载是hibernate的一种机制,主要是解决不必要的查询对资源的浪费,只有当数据真正调用时才加载,而不会对数据进行提前加载造成资源的浪费)。
load()方法就是延迟加载,延迟加载的有效期是在session打开的情况下,当session关闭后,会报异常。当调用load方法加载对象时,返回代理对象,等到真正用到对象的内容时才发出sql语句。

hibernate 使用过滤器来解决懒加载的代码是什么原理

web请求处理的过程大致是 过滤器-controller-渲染jsp-过滤器。懒加载的问题主要发生在要渲染jsp的时候 hibernate session已经关闭,所以解决这个问题的方案应该是在过滤器中把hibernate session关闭。上述代码也不是这个问题最好的解决方法,事务的控制一般是要放在service层,在过滤器中只做开启hibernate session,绑定hibernate session 至threadlocal上,最后关闭hibernate session就行了。可以查一下open session in view

谁能给我解释一下hibernate的懒加载机制?说说这个机制的运作过程

比如有一张学生表,一张班级表,一张年级表
一位学生,他会有学生信息,也会有班级信息,也会有年级信息。在用hibernate的情况下,他们之间就会存在关联映射关系,在默认情况下,我们在执行查询学生信息的时候,hibernate会把学生的所有信息包括班级和年级信息全部一下查出来,但有些信息并不是我们想要的。
所以延迟加载就是为做这事的。我们并不需要的数据我们就不加载,当我们在真正需要他的时候,才去把它加载出来。

什么是hibernate懒加载?什么时候用懒加载?为什么要用懒加载

所谓懒加载(lazy)就是延时加载,延迟加载。
什么时候用懒加载呢,我只能回答要用懒加载的时候就用懒加载。
至于为什么要用懒加载呢,就是当我们要访问的数据量过大时,明显用缓存不太合适,
因为内存容量有限 ,为了减少并发量,减少系统资源的消耗,
我们让数据在需要的时候才进行加载,这时我们就用到了懒加载。
比如部门ENTITY和员工ENTITY,部门与员工1对多,如果lazy设置为false,那么只要加载了一个部门的po,就会根据一对多配置的关系把所有员工的po也加载出来。但是实际上有时候只是需要用到部门的信息,不需要用到 员工的信息,这时员工po的加载就等于浪费资源。如果lazy设置为true,那么只有当你访问部门po的员工信息时候才回去加载员工的po的信息。

hibernate3.0中lazy有三个值,true,false,proxy,默认的是lazy="proxy".
具体设置成什么要看你的需求,并不是说哪个设置就是最好的。
假如在student对象中包含一个head对象
如果你确定在用student对象的时候就要用到head对象里的属性,那你就设置立即加载,因为设置立即加载那么在查询student的同时就会查询student的head,hibernate就会在查询的时候关联两张表从而生成的sql就可能只有一条。而如果你设置的是延迟加载,那么肯定会要生成1 N条sql语句:其中“1”是查询student的语句,“N”是根据N个student的id去查询head的N条语句。而且,延迟加载是要用到的 时候才去执行查询,这样系统判断那里需要加载,那里不需要加载也需要时间,性能上肯定就不如立即加载了!
如果,你是有的地方需要用到student的时候才用到head属性,那么你就设置成延迟加载,因为查询2张表的数据肯定要比查询1张表的数据消耗大。
到低要怎样设置就要看你的实际需求了
延迟加载机制是为了避免一些无谓的性能开销而提出来的,所谓延迟加载就是当在真正需要数据的时候,才真正执行数据加载操作。在Hibernate中提供了对实体对象的延迟加载以及对集合的延迟加载,另外在Hibernate3中还提供了对属性的延迟加载。

Hibernate为什么提供了延迟加载?起什么作用?

非延迟加载在读取一个对象的时候会将与这个对象所有相关的其他对象一起读取出来。
Hibernate提供的延迟加载机制。这种初始化策略只在一个对象调用它的一对多或多对多关系时才将关系对象读取出来。
这个过程对开发者来说是透明的,而且只进行了很少的数据库操作请求,因此会得到比较明显的性能提升。这项技术的一个缺陷是延迟加载技术要求一个Hibernate会话要在对象使用的时候一直开着。

hibernate怎么解决懒加载

第一种:
1.在需要禁用懒加载的映射文件中显示的加入lazy = "false"
这个方法大大的降低了程序的运行效率,如果访问量小还是可以的
第二种:
2.在web.xml中配置

openSessionInViewFilter
org.springframework.orm.hibernate3.support.OpenSessionInViewFilter


openSessionInViewFilter
/*


这是一个一劳永逸解决懒加载问题的办法.使用spring的openSessionInViewFilter.
openSessionInViewFilter,改过滤器在view渲染时始终开启session,一劳永逸解决hibernate的懒加载问题,
该过滤器必须配置在struts2过滤器之前,如果访问增大性能会降低不推荐使用(性能问题)
第三种:
3.强行在service层面是初始化代理对象.
就是在获取对象之后,强行去加载对象中属性集合(推荐)
例如:
public Department getDepartmentWithChildren(Integer id){
Department s = DepartmentDao.getEntity(id)
//强行初始化pages和questions集合
for(Student stu : s.getStudents()){
stu.getClasses.size()
}
return s
}

Hibernate 多对一 一对多 懒加载问题,

lazy=false表示立即加载~
lazy=true表示延迟加载,这个时候,当第一个对象查出来以后,如果你调用了closeSession那么第二个关联对象再想用get方法获取,那就不行了

最新文章