【Hibernate】Re08 加载策略配置

一、关联查询的问题:

使用关联查询,例如简单的一对多关系查询,查出一个部门对象和对应的N个员工对象。

如果一般情况下,我们只是需要部门对象,并不关系关联的员工对象,那么Hibernate关联查询出来的员工对象就是多余的了

所以Hibernate提供了懒加载策略,懒加载策略又称为延迟加载策略,当对象被调用时才会触发加载的需要。

二、可设置延迟加载的三个级别位置:

1、类级别,在Class标签中设置,默认值为True,表示使用延迟加载,False不使用懒加载,立即加载

2、一对多关联使用Set标签,除了上述的True & False,还有一个Extra,表示增强延迟加载

3、多对一关联级别,值区分了两种,Proxy延迟加载,No-Proxy不代理延迟加载,False立即加载

三、Open Session In View模式

懒加载与Session的问题:

使用懒加载,首次查询完毕,如果没有调用关联对象,则不会触发Hibernate延迟加载,Session查询完毕,对象就会被释放

如果调用这个主关系对象去获取关联对象,Session又不存在了,Hibernate就会抛出延迟加载初始化异常

Hibernate社区的解决方案是提出了Open Session In View 模式:

——用户的每一次请求,始终保持一个Sesssion开启状态

配置OSV模式:

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