簡體   English   中英

如何在Web應用程序中使用托管的Hibernate會話

[英]How to use managed Hibernate sessions with a web application

我試圖弄清Hibernate會話管理的工作原理。 我正在嘗試在Web應用程序中定義一個簡單的每次請求會話模型,但是它似乎沒有用。 到目前為止,我有這個:

@WebListener
public class HibernateDataAccess implements ServletRequestListener
{
    Configuration configuration;
    SessionFactory sessionFactory;

    public HibernateDataAccess ()
    {
        configuration = new Configuration ().configure ();
        ServiceRegistry serviceRegistry = new StandardServiceRegistryBuilder ().applySettings (
            configuration.getProperties ()).build ();
        sessionFactory = configuration.buildSessionFactory (serviceRegistry);
    }

    public List<Customer> getAllCustomers () throws SQLException
    {
        Session session = sessionFactory.getCurrentSession ();
        return (List<Customer>) session.createQuery ("select c from Customer c").list ();
    }

    @Override
    public void requestDestroyed (ServletRequestEvent arg0)
    {
        ManagedSessionContext.unbind (sessionFactory).close ();
    }

    @Override
    public void requestInitialized (ServletRequestEvent arg0)
    {
        System.out.println ("requestInitialized called!");
        Session session = sessionFactory.openSession ();
        ManagedSessionContext.bind (session);
        session.beginTransaction ();
    }

}

我的問題是,盡管我收到消息“ requestInitialized call!”。 在服務器的控制台輸出上,當我嘗試從servlet請求(在doGet()方法內部doGet()調用getAllCustomers時,出現以下異常:

org.hibernate.HibernateException: No session currently bound to execution context
at org.hibernate.context.internal.ManagedSessionContext.currentSession(ManagedSessionContext.java:75)
at org.hibernate.internal.SessionFactoryImpl.getCurrentSession(SessionFactoryImpl.java:1013)
at net.meridiandigital.binco.web.HibernateDataAccess.getAllCustomers(HibernateDataAccess.java:38)
at net.meridiandigital.binco.web.CustomerServlet.doGetList(CustomerServlet.java:80)

我究竟做錯了什么?

您是否已將hibernate.current_session_context_class配置參數設置為Hibernate.Context.ICurrentSessionContext實現?

問題非常明顯-我使用的HibernateDataAccess實例在服務器上調用監聽器方法時並不相同,因此注冊了當前會話的會話工廠與我的代碼不同。嘗試使用。 解決方案是將兩個問題分開:有一個完全獨立的@WebListener類,該類調用我的單身HibernateDataAccess來啟動和關閉會話。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM