当前位置: 代码迷 >> J2EE >> hibernate 延迟加载的异常 failed to lazily initialize 在实际项目中怎么处理
  详细解决方案

hibernate 延迟加载的异常 failed to lazily initialize 在实际项目中怎么处理

热度:270   发布时间:2016-04-17 23:43:22.0
hibernate 延迟加载的错误 failed to lazily initialize 在实际项目中怎么办
我看网上的方法
 1 设置lazy=false 但是这样把所有没用的数据加载 还会有死循环 
2 OpenSessionInView 把session不在service层关闭  但是这样会很耗内存
不知道大家实际项目中怎么处理的
------解决方案--------------------
你可以指定OpenSessionInView过滤器只过滤特定URL
------解决方案--------------------
只过滤那些需要用到懒加载的请求,其实大部分请求应该不会用到懒加载吧。

但是你用了spring,session被spring托管了,session的生命周期由spring控制,什么时候关闭session由spring决定,
------解决方案--------------------
看情况而定,看你内存如果足够大就把lazyy设为false好了,你说的有死循环这个得注意思,不是所有的实体类都要写上关联关系,把一些复杂点的关联直接去掉。我一般只配多对一,不配一对多或多对多。这样就避免了查一个实体查询所有子实体的可能,大大提高了查询速度与效率,如果需要用到子实体的地方则另多一个HQL写查询。opensession这个很多人都在用,这个我个人认为主要的作用的于事务,你可以把你所在关于增删改的URL配上这个OPENSESSION,其他的查询什么的不用配上他。
------解决方案--------------------
引用:
Quote: 引用:

看情况而定,看你内存如果足够大就把lazyy设为false好了,你说的有死循环这个得注意思,不是所有的实体类都要写上关联关系,把一些复杂点的关联直接去掉。我一般只配多对一,不配一对多或多对多。这样就避免了查一个实体查询所有子实体的可能,大大提高了查询速度与效率,如果需要用到子实体的地方则另多一个HQL写查询。opensession这个很多人都在用,这个我个人认为主要的作用的于事务,你可以把你所在关于增删改的URL配上这个OPENSESSION,其他的查询什么的不用配上他。

谢谢  你这句话 我一般只配多对一,不配一对多或多对多  你的意思是指你只在多的一方配置吗  不在一的一方配置   不配置双向关联   只配置单项关联????

是的单项并只在多方配。这样配了就无法全用HQL实现你的查询的所以有必要时也要用到hibernate的SQL查询功能。虽然麻类点,不过在性能上有大大的提升
------解决方案--------------------
OpenSessionInView是个致命的东西,别用,直接join查询解决
------解决方案--------------------
引用:
Quote: 引用:

只过滤那些需要用到懒加载的请求,其实大部分请求应该不会用到懒加载吧。

但是你用了spring,session被spring托管了,session的生命周期由spring控制,什么时候关闭session由spring决定,

懒加载在一对多的问题里很常见的啊

像你说的这种情况,完全可以用hql join 连接查询解决。
比如说;
User user = userService.getUser(userId)
List<Role> roles = user.getRoles();
...处理roles时,懒加载user的role。

可以换成hql连接查询 :
hql=“select  r from User u inner join u.roles r where u.id =:userId”


  相关解决方案