Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/hibernate/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何在web应用程序中使用托管Hibernate会话_Java_Hibernate_Servlets - Fatal编程技术网

Java 如何在web应用程序中使用托管Hibernate会话

Java 如何在web应用程序中使用托管Hibernate会话,java,hibernate,servlets,Java,Hibernate,Servlets,我试图弄清楚Hibernate会话管理是如何工作的。我试图在web应用程序中定义一个简单的每请求会话模型,但它似乎不起作用。到目前为止,我有: @WebListener public class HibernateDataAccess implements ServletRequestListener { Configuration configuration; SessionFactory sessionFactory; public HibernateDataAcc

我试图弄清楚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 ();
    }

}

我做错了什么?

是否已将hibernate.current\u session\u context\u类配置参数设置为hibernate.context.ICurrentSessionContext实现

问题很明显-我在服务器上使用的HibernateDataAccess实例与在服务器上调用侦听器方法的实例不同,因此注册当前会话的会话工厂与我的代码尝试使用的会话工厂不同。解决方案是将这两个问题分开:有一个完全独立的@WebListener类,它调用我的singleton HibernateDataAccess来启动和关闭会话。

它被设置为托管,哪个AIUI是org.hibernate.context.internal.ManagedSessionContext的别名。现在,我也直接尝试使用org.hibernate.context.internal.ManagedSessionContext作为值,结果没有变化。
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)