zoukankan      html  css  js  c++  java
  • 【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>

    - - -

  • 相关阅读:
    第四周
    第二次作业
    jsp
    软件测试第一次
    增删改查
    用户添加
    登录
    购物商城
    jsp第七周作业
    jsp第六周作业
  • 原文地址:https://www.cnblogs.com/mindzone/p/13737665.html
Copyright © 2011-2022 走看看