1

openSessionInView在 web.xml 中有过滤器。

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

我已将allowCreateHibernateDaoSupport 的属性设置为true. 现在对于每个数据库操作,如果我获得 SessiongetSession并在事务后关闭 Session,例如:

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有一个获取配置文件。

谢谢并恭祝安康。

4

2 回答 2

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

...
        }
于 2011-05-29T17:13:25.213 回答
1

是的,它会导致问题。通过使用过滤器,您声明您的会话在外部进行管理(创建和关闭)。所以如果你自己关闭它,外部机制将不起作用(并且可能会抛出异常)

于 2011-05-29T17:09:45.983 回答