Java 没有openSession,getCurrentSession如何工作?
这是我的代码: hibernate.cfg.xml 和一个示例DAO类: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
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();
}
}