【发布时间】:2015-12-22 21:32:43
【问题描述】:
我创建了一个这样的 DAO:它基于:Hibernate: CRUD Generic DAO
public class Dao{
SessionFactory sessionFactory;
// initialise session factory
public User save(User o){
return (User) sessionFactory.getCurrentSession().save(o);
}
public User get(Long id){
return (User) sessionFactory.getCurrentSession().get(User.class, id);
}
public User void saveOrUpdate(User o){
sessionFactory.getCurrentSession().saveOrUpdate(o);
}
现在,如果我的 sessionFactory 在 DAO 或其他类中,这一切都很好。但我的问题是从 servletContextListener 调用 SessionFactory:这是我在监听器中的代码:
public void contextInitialized(ServletContextEvent event) {
StandardServiceRegistry registry = new StandardServiceRegistryBuilder().configure().build();
try {
sessionFactory = new MetadataSources(registry).buildMetadata().buildSessionFactory();
event.getServletContext().setAttribute("factory", sessionFactory);
} catch(Exception e) {
e.printStackTrace();
StandardServiceRegistryBuilder.destroy( registry );
}
}
在这种情况下,除了在 DAO 中实际包装 servletRequest 之外,我如何从 DAO 调用 SessionFactory?
【问题讨论】:
-
为什么要将 Hibernate
SessionFactory存储在ServletContext中?关于关注点分离的整个想法是,您不希望您的 MVC 应用程序层必须知道如何访问您的数据,即它不应该从不担心数据/persistence 层完全。你正在做的事情使你的 DAO 完全依赖于你的 web 层,这根本不推荐。 -
看起来是 XY 问题。您当然不想将 SessionFactory 放在 ServletContext 中并让 DAO 从那里获取它。您应该提供有关应用程序总体设计的一些背景信息。
-
@Buhake Sindi “为什么要将 Hibernate SessionFactory 存储在 ServletContext 中?” - 我希望它在应用程序启动期间被初始化。我想不出任何其他方式来实现它。
-
@Serge Ballesta - 这只是一些 CRUD,实用方法很少。
-
我宁愿 DAO 与
Session一起工作。如果 DAO 没有会话,则从SessionFactory获取它,因为 'sessionFactory' 是每个应用程序生命周期构建一次的线程安全对象。你不必担心它。或者,创建一个单独的HibernateUtils类,它会返回一个SessionFactory。
标签: hibernate servlets dao sessionfactory servletcontextlistener