Code Bye

hibernate 延迟加载的错误 failed to lazily initialize

 

我看网上的方法
 1 设置lazy=false 但是这样把所有没用的数据加载 还会有死循环 
2 OpenSessionInView 把session不在service层关闭  但是这样会很耗内存
不知道大家实际项目中怎么处理的


10分
你可以指定OpenSessionInView过滤器只过滤特定URL

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

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

引用 1 楼 u013972119 的回复:

你可以指定OpenSessionInView过滤器只过滤特定URL

这样会耗内存的啊  session一直放在内存里

引用 2 楼 u013972119 的回复:

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

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

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


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

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

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


20分
引用 6 楼 hadoop000 的回复:
Quote: 引用 5 楼 bichir 的回复:

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

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

是的单项并只在多方配。这样配了就无法全用HQL实现你的查询的所以有必要时也要用到hibernate的SQL查询功能。虽然麻类点,不过在性能上有大大的提升

引用 7 楼 bichir 的回复:
Quote: 引用 6 楼 hadoop000 的回复:
Quote: 引用 5 楼 bichir 的回复:

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

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

是的单项并只在多方配。这样配了就无法全用HQL实现你的查询的所以有必要时也要用到hibernate的SQL查询功能。虽然麻类点,不过在性能上有大大的提升

还是不是很明白呢  到底是单方在多的一方配   还是在双方 多的一方和一的一方都要配置呢


20分
OpenSessionInView是个致命的东西,别用,直接join查询解决
引用 9 楼 yys79 的回复:

OpenSessionInView是个致命的东西,别用,直接join查询解决

OpenSessionInView确实很消耗内存啊  那怎么JOIN解决啊


20分
引用 4 楼 hadoop000 的回复:
Quote: 引用 2 楼 u013972119 的回复:

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

但是你用了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”


CodeBye 版权所有丨如未注明 , 均为原创丨本网站采用BY-NC-SA协议进行授权 , 转载请注明hibernate 延迟加载的错误 failed to lazily initialize