mysql hibernate 延迟_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语句的生成。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值