Влияет ли Session.close () на openSessionInView в Spring? - PullRequest
1 голос
/ 29 мая 2011

У меня есть openSessionInView фильтр в web.xml.

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

И я установил allowCreate свойство HibernateDaoSupport на true. Теперь для каждой операции с базой данных, если я получу Session по getSession и закрою 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 имеет профиль выборки.

Спасибо и всего наилучшего.

Ответы [ 2 ]

2 голосов
/ 29 мая 2011

если 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 голос
/ 29 мая 2011

Да, это вызовет проблемы. Используя фильтр, вы заявляете, что ваш сеанс управляется (создается и закрывается) извне. Поэтому, если вы закроете его самостоятельно, внешний механизм не будет работать (и может выдать исключение)

...