当前位置:编程学习 > JAVA >>

Hibernate非延迟加载与多包获取问题的解决

Hibernate 非延迟加载与多包获取问题的解决

 

1.      cannot simultaneously fetchmultiple bags

假设你有几个实体,如User, Role, ModuleItem,Group……等,他们之间的存在多对多关系,必然会使用到较多的ManyToMany和ManyToOne关联。

假如在User的roles属性设置了非延迟加载(@ManyToMany(fetch = FetchType.EAGER),而Role的moduleItems属性同样设置了非延迟加载(@ManyToMany(fetch = FetchType.EAGER)。同时ModuleItem又对其他对象设置了非延迟加载,一旦级联数目多了,必然引起cannot simultaneously fetch multiple bag错误。

 

解决办法也很简单:适当地使用FetchType.LAZY即可。

 

2.      no session orsession was closed

但是,延迟加载毕竟不是一个便捷的方法,譬如大量的代码使用了user.getRoles()和role.getModuleItems(),当代码执行到这一行时,必然引起会话已关闭的错误:

failed to lazilyinitialize a collection of role: org.deeblue.entity.Role.users, failed tolazily initialize a collection of role: org.deeblue.entity.Role.users, nosession or session was closed

 

解决办法,用回FetchType.EAGER,但需要改变FetchMode的策略。

Hibernate的默认策略是JOIN,究其原因是它无法翻译成含jion子句的可执行的sql语句。我们需要改变它:

 

@ManyToMany(fetch = FetchType.EAGER)

@org.hibernate.annotations.Fetch(@org.hibernate.annotations.FetchMode.SELECT)

 

这样,使用低效的逐个查询SELECT方法,即可满足sql语句的生成。

作者“Samland的专栏”

补充:软件开发 , Java ,
CopyRight © 2022 站长资源库 编程知识问答 zzzyk.com All Rights Reserved
部分文章来自网络,