Java 选择或不选择后是否需要关闭休眠会话?

Java 选择或不选择后是否需要关闭休眠会话?,java,hibernate,hibernate-session,Java,Hibernate,Hibernate Session,如果我使用SessionFactory private SessionFactory sessionFactory = HibernateUtil.getSessionFactory(); public Session getSession() { return sessionFactory.openSession(); } 并在我的DAO类中使用它: public List<Entity> fetchEntities(Date fr

如果我使用
SessionFactory

private SessionFactory sessionFactory = HibernateUtil.getSessionFactory();
    public Session getSession() {
            return sessionFactory.openSession();
        }
并在我的DAO类中使用它:

public List<Entity> fetchEntities(Date fromDate, Date toDate) {
 Criteria criteria = getSession().createCriteria(Entity.class);
        criteria.add(Restrictions.between("cts", fromDate, toDate));
        criteria.addOrder(Order.desc("cts"));
        return (List<Entity>) criteria.list();
}
公共列表获取实体(日期fromDate,日期toDate){
Criteria=getSession().createCriteria(Entity.class);
添加(限制之间(“cts”、起始日期、截止日期));
标准。添加订单(订单描述(“cts”);
返回(列表)条件。列表();
}

我是否需要结束会话?如何治疗

不是。实际上,您的web franwork(如spring)或声明式事务管理将为您完成这项工作。但在某些情况下,您希望自己管理会话。与批处理类似-由于hibernate会话缓存不断增长,hibernate会话的范围应该是当前工作单元(即事务)(请记住会话不是线程安全的)

工厂应在整个应用程序生命周期内保留

另见


请注意,如果使用的是
SessionFactory.getCurrentSession()
,则不需要显式关闭它,因为它从持久性上下文中获取当前会话,该上下文在事务启动时创建会话,并在事务完成时关闭会话。

否,这不是JPA API。请不要将其标记为这样,因为您是自己管理会话和事务的,所以您必须在任何CRUD操作后关闭它,除非您希望在执行链中重用相同的会话(而不是并行),hibernate会话(JPA中的EntityManager)可能是容器或应用程序管理的,这里是第二种情况。如果从hibernate会话中获取EntityManager,您是否会显式关闭它?
public List<Entity> fetchEntities(Date fromDate, Date toDate) {
 Criteria criteria = getSession().createCriteria(Entity.class);
        criteria.add(Restrictions.between("cts", fromDate, toDate));
        criteria.addOrder(Order.desc("cts"));
        return (List<Entity>) criteria.list();
}
public List<Entity> fetchEntities(Date fromDate, Date toDate) {
     Session session;
     try{
        session = getSession();
        Criteria criteria = session.createCriteria(Entity.class);
        criteria.add(Restrictions.between("cts", fromDate, toDate));
        criteria.addOrder(Order.desc("cts"));
        return (List<Entity>) criteria.list();
       }
       finally {
         if (session != null) {
           session.close();
       }
}