Hibernate的抓取策略与Lazy笔记

bigcactus 2013-03-20

遇到的需求:

在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"

相关推荐

LetonLIU / 0评论 2020-05-29
东方咖啡屋 / 0评论 2020-01-06