我在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具有访存配置文件。

谢谢并恭祝安康。

最佳答案

如果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();

...
        }

07-21 10:58