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

新手求教hibernate懒加载的问题 hibernate什么时候会抛出懒加载的异常

2023-06-25 12:28:31 互联网 未知 开发

 新手求教hibernate懒加载的问题 hibernate什么时候会抛出懒加载的异常

新手求教hibernate懒加载的问题

使用OpenSessionInViewFilter 如果将Spring托管Hibernate的sessionFatory的话,在执行一次数据库操作后,2113session就会被关闭,如果再执行操5261作的话,就会抛出延迟加载的异4102常,如果关闭延迟加载,效率直线下降,显然是不理智的,为解决此问题,Spring提供了OpenSessionInViewFilter,将1653session的生命周期从一次数据库操作延长版到一个request的生命周期,在这个request生命周期中无论你权进行多少次数据库操作都没问题。

hibernate什么时候会抛出懒加载的异常

懒加载的异常有很多种,你指的是不是session已经关闭的异常?因为那个初学者最容易遇到
情况是当你加载出一个一对多关系的一这端的对象,然后在出了事务之后的地方,比如页面上,还想再获取多端对象里面的除了id以外的属性的时候,就会跑出这个异常。
我举个例子,你有一个 Grade 对象关联了 很多 Student 对象,并且用的是懒加载
你在service里面通过数据库查询获得了一个 Grade对象,这个对象里面有一个Setstudents 集合,但是你并没有对这个对象做进一步的处理(比如 intialize之类的操作让懒加载的代理对象真正去实例化) 然后你到了页面的展示的时候,去遍历 students 这个集合,并且你试图在页面上显示每个 student 的 name 属性(这个属性不是studentId) 这个时候就会抛出session已经关闭的异常

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中什么是懒加载异常?该怎么处理懒加载异常

什么时候用懒加载呢,我只能回答要用懒加载的时候就用懒加载。
至于为什么要用懒加载呢,就是当我们要访问的数据量过大时,明显用缓存不太合适,
因为内存容量有限 ,为了减少并发量,减少系统资源的消耗,
我们让数据在需要的时候才进行加载,这时我们就用到了懒加载。
比如部门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 多对一 一对多 懒加载问题,

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

hibernate多对一查询,懒加载,查询语句问题

这就是懒加载的特性,为什么要叫懒加载呢,就是因为懒加载不需要你手动去查询与该表关联的其他表,系统会自动帮你去查询,所以会出现2条或者2条以上的语句!除非你自己用fetch来手动连接,不然的话就是这样的!

最新文章