使用关联查询,例如简单的一对多关系查询,查出一个部门对象和对应的N个员工对象。
如果一般情况下,我们只是需要部门对象,并不关系关联的员工对象,那么Hibernate关联查询出来的员工对象就是多余的了
所以Hibernate提供了懒加载策略,懒加载策略又称为延迟加载策略,当对象被调用时才会触发加载的需要。
1、类级别,在Class标签中设置,默认值为True,表示使用延迟加载,False不使用懒加载,立即加载
2、一对多关联使用Set标签,除了上述的True & False,还有一个Extra,表示增强延迟加载
3、多对一关联级别,值区分了两种,Proxy延迟加载,No-Proxy不代理延迟加载,False立即加载
懒加载与Session的问题:
使用懒加载,首次查询完毕,如果没有调用关联对象,则不会触发Hibernate延迟加载,Session查询完毕,对象就会被释放
如果调用这个主关系对象去获取关联对象,Session又不存在了,Hibernate就会抛出延迟加载初始化异常
Hibernate社区的解决方案是提出了Open Session In View 模式:
——用户的每一次请求,始终保持一个Sesssion开启状态
JavaEE规范支持
@WebFilter("/*") public class OpenSessionInViewFilter implements Filter { @Override public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException { Transaction transaction = null; try { transaction = HibernateUtil.getCurrentSession().beginTransaction(); filterChain.doFilter(servletRequest, servletResponse); transaction.commit(); } catch (Exception exception) { exception.printStackTrace(); if (transaction != null) transaction.rollback(); } } }
当然,如果不是注解配置而是使用web.xml配置:
<filter> <filter-name>OpenSessionInView</filter-name> <filter-class>cn.zeal4j.filter.OpenSessionInViewFilter</filter-class> </filter> <filter-mapping> <filter-name>OpenSessionInView</filter-name> <url-pattern>/*</url-pattern> </filter-mapping>
- - -
原文:https://www.cnblogs.com/mindzone/p/13737665.html