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