`

hibernate中使用getCurrentSession()方法

 
阅读更多
从3.0.1版本开 始,Hibernate增加了SessionFactory.getCurrentSession()方法。
采用getCurrentSession()创建的session在commit或rollback时会自动关闭,如果commit()之后再关闭,就会报session已经关闭的错误;但是如果不commit()而执行关闭,虽然不会报什么错误,但是这时观察数据库添加数据是没有成功的,而openSession必须手动关闭。
在一个应用程序中,如果DAO 层使用Spring来控制session 的生命周期,则首选getCurrentSession()。

在 SessionFactory 启动的时候,Hibernate 会根据配置创建相应的 CurrentSessionContext,在 getCurrentSession()被调用的时候,实际被执行的方法是 CurrentSessionContext.currentSession()。在 currentSession() 执行时,如果当前Session 为空,currentSession 会调用 SessionFactory的openSession。

getCurrentSession配置:

如果使用的是本地事务(jdbc事务)

<property name="hibernate.current_session_context_class">thread</property>

如果使用的是全局事务(jta事务)

<property name="hibernate.current_session_context_class">jta</property> 

创建session的另一种方法:
Hibernate官方开发手册的示例中,提供了一个通过ThreadLocal维护Session的示例:这种方法可以使session提交后自动关闭

public class HibernateUtil {
 
private static SessionFactory sessionFactory;
 
static {
 
try {
 
// Create the SessionFactory
 
sessionFactory = new
 
Configuration().configure().buildSessionFactory();
 
} catch (HibernateException ex) {
 
throw new RuntimeException(
 
"Configuration problem: " + ex.getMessage(),
 
ex
 
);
 
}
 
}
 
public static final ThreadLocal session = new ThreadLocal();
 
public static Session currentSession() throws HibernateException
 
{
 
Session s = (Session) session.get();
 
// Open a new Session, if this Thread has none yet
 
if (s == null) {
 
s = sessionFactory.openSession();
 
session.set(s);
 
}
 
return s;
 
}
 
public static void closeSession() throws HibernateException {
 
Session s = (Session) session.get();
 
session.set(null);
 
if (s != null)
 
s.close();
 
}
 
}
分享到:
评论

相关推荐

    新Hibernate SessionFactory().getCurrentSession()猫腻

    NULL 博文链接:https://zgdkik.iteye.com/blog/1835667

    basic-common2h3:基于hibernate3的BaseDao,完成增删改查、分页操作

    使用方法,以用户添加为例: 1、定义User类,并提供get和set方法。 2、定义IUserDao接口,使其继承IBaseDao并传入泛型。若提供的方法不满足需求, 可以在此接口中定义自己的业务方法,然后在IUserDao的实现类中 通过...

    hibernate 学习笔记

    hibernate 学习笔记: 了解hibernate的基本概念 配置hbm.xml cfg.xml 快速入门案例3: 从domain-xml-数据库表 hibernate的核心类和接口 openSession()和getCurrentSession() 线程局部变量...在web项目中开发hibernate

    mysql+jdbc+jsp+Hibernate3.2+tomcattomcat5.028成功测试

    mysql,jdbc,Hibernate,tomcat [mysql+jdbc+jsp+Hibernate3.2+tomcattomcat5.028成功测试-简单] &lt;br&gt; 1 .数据库设计:库mydb 表events &lt;br&gt;EVENT_ID BIGINT(20) NOT NULL AUTOINC EVENT_DATE DATETIME...

    SSH-Jsp期末考试简答题带答案

    openSession()和getCurrentSession()是Hibernate中两个重要的Session创建方法。采用getCurrentSession()创建的Session会绑定到当前的线程中去,而采用openSession()则不会。getCurrentSession()创建的Session在...

    Hibernate5的Query接口浅析

    使用Query对象可以方便的查询数据库中的数据,它主要使用HQL或者本地SQL查询数据。Query对象不仅能查询数据,还可以绑定参数、限制查询记录数量、实现批量删除和批量更新等。 Configuration cfg=new Configuration()...

    Hibernate 修改数据的实例详解

    Hibernate 修改数据 1.用 HQL方式来更新 在 这里修改 Person 的name 和age 通过 id 标识 Session currentSession = H3Utils.getCurrentSession(); currentSession.beginTransaction(); //创建 HQL String ...

    Java面试宝典2020修订版V1.0.1.doc

    21、数组中有没有length()方法,String中有没有length()方法? 18 23、final, finally, finalize的区别。 18 24、‘==’和equals的区别? 18 25、JAVA中Object类中有哪些常用方法? 19 26、heap和stack有什么区别...

    Java常见面试题208道.docx

    118.在 hibernate 中使用 Integer 和 int 做映射有什么区别? 119.hibernate 是如何工作的? 120.get()和 load()的区别? 121.说一下 hibernate 的缓存机制? 122.hibernate 对象有哪些状态? 123.在 hibernate 中 ...

    NHibernate Demo

    3.程式中使用只需要打开连接,不需要关闭 4.ISession session = NHibernateHelper.GetSession("HR"); 带参数的需要在Config中增加NHConfigSettings节,格式同AppSettings .GetCurrentSession();不带参数的情况下Web....

    OA项目SSH整合框架

    一,集成 Spring 与 Hibernate 1,配置SessionFactory 1,配置 ---------------------- applicationContext.xml ------------------------ &lt;!-- 配置SessionFactory(整合Hibernate) --&gt; ...

    无垠式代码生成器最新功能与文档增强版0.7.22

    3)增强修复S2SH技术栈,不再使用openSession语句,而是使用getSessionFactory().getCurrentSession(), Spring 3,Spring 4通用,同时web.xml里增加SpringOpenSessionInViewFilter ===============0.7.19.2==========...

    三大框架下分页源代码

    上面就个成员变量再给个set()get()方法; //查询全部 public String findAll()throws Exception{ List&lt;TblNews&gt; list = newsService.page(getRowsno()); //参数是算出的页面的总条数 if(list.size()!=0){...

Global site tag (gtag.js) - Google Analytics