1

openSessionInViewweb.xmlにフィルターがあります。

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

そしてallowCreate、HibernateDaoSupport のプロパティを に設定しましたtruegetSessionセッションを取得し、トランザクションの後にセッションを閉じると、データベース操作ごとに次のようになります。

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 に答える