org.hibernate.LazyInitializationException:
failed to lazily initialize a collection of role: com.coolding.boot.base.modules.sys.repository.entity.SysAccount.offices, could not initialize proxy - no Session
案发现场:
在SpringBoot测试Test中遇到,
操作涉及到了多对多关系
session自动关闭了
建议:
网上解决办法多数都需要修改配置,在test中尽量只测试接口。
在业务中可以尝试写一个方法,用于被触发,把要测试的代码放进去。
原因:
Hibernate延迟加载策略,也就是用到的时候才去加载,这样可以提高一些性能.。
Hibernate的lazy loading 采用了一个HibernateSession来管理session,它的逻辑是每进行一次数据库操作,就开新的session,操作完成后立即关闭该session。这样做的好处是可以严格关闭session,避免菜鸟级的错误,但是并不推荐这么做。因为这不适合lazy loading,也不适合跨方法的事务。
比如在我们的应用中,user->post形成一对多的映射,User中有一个包含post的List。
在User中,有多个属性:name,password,phone等,还有一个List类型的posts。当我们对posts使用lazy laoding的时候,hibernate会在获得User对象的时候,仅仅返回name,password,phone等基本属性,当你访问posts的时候,它才会从数据库中提取posts需要的数据,这就是所谓lazy laoding。但是在我们的系统中,session是被立即关闭的,也就是在读取了name,password,phone等基本属性后,session已经close了,再进行lazy loaiding就会有异常。