Java 没有openSession,getCurrentSession如何工作?

Java 没有openSession,getCurrentSession如何工作?,java,hibernate,servlets,Java,Hibernate,Servlets,这是我的代码: hibernate.cfg.xml 和一个示例DAO类: package biz.tugay.saqila.dao; /* User: koray@tugay.biz Date: 06/08/15 Time: 18:37 */ import biz.tugay.saqila.model.Actor; import org.hibernate.Session; import java.util.List; @SuppressWarnings("unchecked") publ

这是我的代码:

hibernate.cfg.xml

和一个示例DAO类:

package biz.tugay.saqila.dao;
/* User: koray@tugay.biz Date: 06/08/15 Time: 18:37 */

import biz.tugay.saqila.model.Actor;
import org.hibernate.Session;

import java.util.List;

@SuppressWarnings("unchecked")
public class ActorDao {

    public List<Actor> getAllActors() {
        Session session = HibernateUtil.getCurrentSession();
        session.beginTransaction();
        List<Actor> actors = session.createQuery("FROM Actor").list();
        session.close();
        return actors;
    }

    public Actor getWithId(int id) {
        Session session = HibernateUtil.getCurrentSession();
        session.beginTransaction();
        Actor actor = (Actor) session.get(Actor.class, id);
        session.close();
        return actor;
    }

}
说:

获取当前会话。定义current的确切含义,由配置为使用的CurrentSessionContext impl控制

您正在使用ThreadLocalSessionContext。说:

CurrentSessionContext impl,通过当前执行线程确定当前会话概念的范围。[…]出于可用性的考虑,决定让此默认impl在第一次请求时实际生成一个会话,然后在提交/回滚与该会话关联的事务后将其清除

你不应该以这种方式结束会议。相反,您应该提交已经开始的事务。这将关闭会话,如文档所述。

如果将hibernate.current\u session\u context\u类设置为thread,则可以使用SessionFactory.getCurrentSession在应用程序中的任何位置访问该会话

如果不希望会话绑定到上下文,则使用OpenSession。在某些情况下,您可能需要一个不同的会话,而不是绑定到上下文的会话。在这种情况下,您可以使用OpenSession而不是currentSession

SessionFactory.openSession始终打开一个新会话,完成DB操作后必须关闭该会话。SessionFactory.getCurrentSession返回绑定到上下文的会话,您无需关闭该会话


您不应该为每个应用程序使用一个会话-会话不是线程安全对象,不能由多个线程共享。始终为每个事务使用一个会话

这样做是正确的吗?会话会话=HibernateUtil.getCurrentSession;事务=session.beginTransaction;List actors=session.createQueryFROM Actor.List;transaction.commit;返回演员;更好,但仍然不能正确处理异常。文档中解释了正确的习惯用法:。但如果我是您,我会尝试使用一个允许声明式事务管理的框架:EJB或Spring。这将允许您避免编写所有这些样板代码。您永远不应该在每个应用程序中使用一个会话-会话不是线程安全对象->所以您的意思是我应该使用openSession?
package biz.tugay.saqila.dao;
/* User: koray@tugay.biz Date: 06/08/15 Time: 18:29 */

import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.boot.registry.StandardServiceRegistryBuilder;
import org.hibernate.cfg.Configuration;
import org.hibernate.service.ServiceRegistry;

public class HibernateUtil {

    private static SessionFactory SESSION_FACTORY;

    public static void buildSessionFactory() {
        if (SESSION_FACTORY != null) {
            return;
        }

        Configuration configuration = new Configuration();
        configuration.configure();
        ServiceRegistry serviceRegistry = new StandardServiceRegistryBuilder()
                .applySettings(configuration.getProperties()).build();
        SESSION_FACTORY = configuration.buildSessionFactory(serviceRegistry);

    }

    public static Session getCurrentSession() {
        return SESSION_FACTORY.getCurrentSession();
    }

    public static void killSessionFactory() {
        if (SESSION_FACTORY != null) {
            SESSION_FACTORY.close();
        }
    }

}
package biz.tugay.saqila.dao;
/* User: koray@tugay.biz Date: 06/08/15 Time: 18:37 */

import biz.tugay.saqila.model.Actor;
import org.hibernate.Session;

import java.util.List;

@SuppressWarnings("unchecked")
public class ActorDao {

    public List<Actor> getAllActors() {
        Session session = HibernateUtil.getCurrentSession();
        session.beginTransaction();
        List<Actor> actors = session.createQuery("FROM Actor").list();
        session.close();
        return actors;
    }

    public Actor getWithId(int id) {
        Session session = HibernateUtil.getCurrentSession();
        session.beginTransaction();
        Actor actor = (Actor) session.get(Actor.class, id);
        session.close();
        return actor;
    }

}
package biz.tugay.saqila.servlet;
/* User: koray@tugay.biz Date: 06/08/15 Time: 19:00 */


import biz.tugay.saqila.dao.HibernateUtil;

import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;
import javax.servlet.annotation.WebListener;

@WebListener
public class HibernateConfigurator implements ServletContextListener {

    @Override
    public void contextInitialized(ServletContextEvent servletContextEvent) {
        HibernateUtil.buildSessionFactory();
    }

    @Override
    public void contextDestroyed(ServletContextEvent servletContextEvent) {
        System.out.println("Killing Session Factory.");
        HibernateUtil.killSessionFactory();
    }

}