Session.close()是否对Spring openSessionInView有影响?

时间:2011-05-29 17:05:23

标签: java hibernate spring open-session-in-view

我在web.xml中有openSessionInView过滤器。

<filter>
    <filter-name>openSessionInView</filter-name>
    <filter-class>org.springframework.orm.hibernate3.support.OpenSessionInViewFilter</filter-class>
</filter>

我已将HibernateDaoSupport的allowCreate属性设置为true。现在,对于每个数据库操作,如果我通过getSession获取会话并在事务之后关闭会话,如:

public List<User> getAllUsers() {
    Session session = getSession();
    session.enableFetchProfile("USER-ROLE-PROFILE");
    Transaction transaction = session.beginTransaction();
    DetachedCriteria criteria = DetachedCriteria.forClass(User.class);
    List<User> users = criteria.getExecutableCriteria(session).list();
    transaction.commit();
    session.disableFetchProfile("USER-ROLE-PROFILE");
    session.close();
    return users;
}

然后此会话关闭会在openSessionInView

中创建任何问题

另一个问题: 这是做各种休眠操作的好方法吗?在上面的代码中,实体User具有获取配置文件。

谢谢和问候。

2 个答案:

答案 0 :(得分:2)

如果getAllUsers()是请求生命周期中的最后一件事,那么这种方法是可以接受的。但是如果你想做更多的数据库操作,那么你必须打开一个新的会话,因为你已经关闭了它。此外,如果您不关闭会话,它将被过滤器关闭:

    public void doFilter(ServletRequest request, ServletResponse response,
            FilterChain chain) throws IOException, ServletException {

...// sf is SessionFactory

            sf.getCurrentSession().beginTransaction();

            // Call the next filter (continue request processing)
            chain.doFilter(request, response);

            sf.getCurrentSession().getTransaction().commit();

...
        }

答案 1 :(得分:1)

是的,这会导致问题。通过使用过滤器,您可以声明外部管理(创建和关闭)会话。因此,如果您自己关闭它,外部机制将无法工作(并可能抛出异常)