[英]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.