Hibernate的抓取策略与Lazy笔记

遇到的需求:

在Spring启动时,需要加载resource下的roles(两者为多对多)。


遇到的问题:

由于需要在程序的其他地方做多对多的criteria分页查询,如果设置resource下的roles为fetch=FetchType.MEAGER 那么会出现N+1的问题。但如果设置fetch=FetchType.LAZY 那么会出现在Spring加载时出现Hibernate No Session Found异常(因为查询已经结束,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"

猜你喜欢

转载自andy-ghg.iteye.com/blog/1832316