`

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()猫腻

    标题提到的"新Hibernate SessionFactory().getCurrentSession()猫腻"揭示了一个常见的使用误区或者说是陷阱,即不正确地使用SessionFactory的getCurrentSession()方法。这篇文章可能探讨了这个方法在实际应用中的...

    ssh中getCurrentSession的使用

    在描述中提到的"ssh中getCurrentSession的使用",实际上可能是指在SSH集成框架中使用Hibernate框架时,获取数据库会话(Session)的方法。 在Hibernate中,`getCurrentSession()`是SessionFactory类的一个方法,它...

    Hibernate存储Clob字段的方式总结

    Hibernate存储Clob字段的方式总结涉及了在Java开发中使用Hibernate操作大型文本字段Clob的操作方法。本文主要介绍了两种操作Clob字段的方法,一种是将Clob字段直接映射为String类型,另一种是使用Clob类型进行处理。...

    hibernate执行原生sql语句

    在上面的代码中,我们使用 `HibernateCallback` 接口来执行原生 SQL 语句,该接口提供了一个 `doInHibernate()` 方法,该方法将在 Hibernate 事务中执行。我们可以在该方法中执行原生 SQL 语句,并使用 `Connection`...

    getCurrentSession 与 openSession() 的区别

    例如,在Spring框架中使用`@Transactional`注解的场景: ```java @Service @Transactional public class UserService { private SessionFactory sessionFactory; public void addUser(User user) { Session ...

    SessionFactory.getCurrentSession与openSession的区别

    至于文件名称“spring_hibernate_1”,这可能是一个包含有关Spring与Hibernate整合的教程或示例代码的压缩包,其中可能有具体的例子来展示如何在Spring中配置SessionFactory和使用这两种方法来管理数据库会话。...

    Hibernate源代码分析

    首先,从 org.hibernate.cfg.Configuration.java 开始,使用 Hibernate 框架实现应用程序,首先就要与 org.hibernate.cfg.Configuration 打交道,要使用 Configuration.buildSessionFactory() 方法获得一个 ...

    Hibernate更新某些字段

    ### 方法二:在 Annotation 中使用 @Column(updatable=false) 在使用 Annotation 配置时,我们可以使用 @Column(updatable=false) 注解来设置某些属性的更新权限。例如,我们可以设置 age 属性的更新权限为 false:...

    在hibernate中的数据库操作

    ### 在Hibernate中的数据库操作 #### Hibernate简介 Hibernate是一种开源的对象关系映射(ORM)框架,用于Java环境下的数据库操作。它允许开发人员将Java对象映射到关系型数据库中的表,并支持面向对象的方法来处理...

    Hibernate源代码分析(一)

    Hibernate 源代码分析 (一):设计属于我的 SessionFactory 和 ConnectionProvider ...通过这篇文章,我们可以了解到 Hibernate 框架的核心机制,掌握 Hibernate 框架的使用方法,提高自己的开发效率和质量。

    springboot集成hibernate

    在本文中,我们将深入探讨如何将Spring Boot框架与Hibernate ORM集成,特别是在不使用JPA(Java Persistence API)的情况下。Spring Boot以其便捷的自动配置和简化Java应用开发而广受欢迎,而Hibernate作为Java领域...

    struts+hibernate 项目

    Struts和Hibernate是Java Web开发中的两个重要框架,它们在构建高效、可维护的Web应用程序时发挥着关键作用。这个“Struts+Hibernate项目”旨在为开发者提供一个学习和实践的平台,帮助他们快速理解这两种框架的集成...

    Spring+Hibernate实现)Hibernate公用类

    这样,`EntityDao`接口和`EntityDaoImpl`实现类就可以使用`BaseEntity`作为泛型参数,确保方法适用于所有继承自`BaseEntity`的实体。 通过这种方式,Service层可以直接调用`EntityDao`接口的方法,而无需关心具体的...

    hibernate二级缓存

    Hibernate二级缓存是ORM框架Hibernate中的一个重要特性,它旨在提高数据访问效率,减少对数据库的直接操作,从而提升系统的响应速度。在大型数据库系统中,合理利用缓存机制能够显著优化性能,尤其是在高并发场景下...

    Hibernate常用总结

    } // 添加方法 public void addJob(JobsDemo job) { // 获得连接对象 session = HibernateSessionFactory.getCurrentSession(); // 开始事务 tr = session.beginTransaction(); // 保存对象 session.save(job); // ...

    hibernate 4.3.10 版本的笔记

    - `getCurrentSession()`方法则会在当前线程中获取一个Session,如果当前线程没有Session,则会自动创建一个新的Session。这种方式适用于需要跨多个方法调用的事务管理。 #### 四、Hibernate生命周期状态 - **瞬...

Global site tag (gtag.js) - Google Analytics