举例说明
用户表-角色表-权限表三表多对多(ManyToMany)关联,其中如果用户-角色级联fetch=eager,角色和权限对应的必须为lazy,否则会抛异常org.hibernate.loader.MultipleBagFetchException: cannot simultaneously fetch multiple bags
请问如果3表都像配置fetch=eager如何解决,小弟在此先谢过!
举例说明
用户表-角色表-权限表三表多对多(ManyToMany)关联,其中如果用户-角色级联fetch=eager,角色和权限对应的必须为lazy,否则会抛异常org.hibernate.loader.MultipleBagFetchException: cannot simultaneously fetch multiple bags
请问如果3表都像配置fetch=eager如何解决,小弟在此先谢过!
Hibernate Annotation的 *ToOne默认的FetchType是EAGER的,fetch=FetchType.EAGER加载数据的时候是一次性加载可能会造成不必要的性能浪费,使用是应该慎重考虑。
对于你这个是3表多对多,在抓取策略上可以考虑使用子查询抓取@Fetch(FetchMode.SUBSELECT)。
[code="java"]
@ManyToMany
@JoinTable(name = "T_USER_ROLE", joinColumns = { @JoinColumn(name = "USER_ID") }, inverseJoinColumns = { @JoinColumn(name = "ROLE_ID") })
@Fetch(FetchMode.SUBSELECT)
public Set getRoles() {
return roles;
}
[/code]
@Fetch(FetchMode.SUBSELECT)产生两条sql语句,第二条语句使用id in (.....)查询出所有关联的数据。除非你显式的指定lazy="false"禁止延迟抓取(lazy fetching),否则只有当你真正访问关联关系的时候,才会执行第二条select语句。