Hibernate的抓取策略与Lazy笔记
遇到的需求:
在Spring启动时,需要加载resource下的roles(两者为多对多)。
遇到的问题:
由于需要在程序的其他地方做多对多的criteria分页查询,如果设置resource下的roles为fetch=FetchType.MEAGER那么会出现N+1的问题。但如果设置fetch=FetchType.LAZY那么会出现在Spring加载时出现HibernateNoSessionFound异常(因为查询已经结束,Session被关闭)。
解决的方法:
利用FetchMode.JOIN单独写一个查询方法用于查询roles,代码如下:
public Set<SYSRole> getRoles(String resid) { Criteria c = getSession().createCriteria(SYSResource.class); c.add(Restrictions.eq("id", resid)); c.setFetchMode("roles", FetchMode.JOIN); SYSResource r = (SYSResource) c.uniqueResult(); log.info(r.toString()); return r.getRoles(); }
注意事项:
需要注意查询的事务是propagation="REQUIRED"