从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()猫腻"揭示了一个常见的使用误区或者说是陷阱,即不正确地使用SessionFactory的getCurrentSession()方法。这篇文章可能探讨了这个方法在实际应用中的...
在描述中提到的"ssh中getCurrentSession的使用",实际上可能是指在SSH集成框架中使用Hibernate框架时,获取数据库会话(Session)的方法。 在Hibernate中,`getCurrentSession()`是SessionFactory类的一个方法,它...
Hibernate存储Clob字段的方式总结涉及了在Java开发中使用Hibernate操作大型文本字段Clob的操作方法。本文主要介绍了两种操作Clob字段的方法,一种是将Clob字段直接映射为String类型,另一种是使用Clob类型进行处理。...
在上面的代码中,我们使用 `HibernateCallback` 接口来执行原生 SQL 语句,该接口提供了一个 `doInHibernate()` 方法,该方法将在 Hibernate 事务中执行。我们可以在该方法中执行原生 SQL 语句,并使用 `Connection`...
例如,在Spring框架中使用`@Transactional`注解的场景: ```java @Service @Transactional public class UserService { private SessionFactory sessionFactory; public void addUser(User user) { Session ...
至于文件名称“spring_hibernate_1”,这可能是一个包含有关Spring与Hibernate整合的教程或示例代码的压缩包,其中可能有具体的例子来展示如何在Spring中配置SessionFactory和使用这两种方法来管理数据库会话。...
首先,从 org.hibernate.cfg.Configuration.java 开始,使用 Hibernate 框架实现应用程序,首先就要与 org.hibernate.cfg.Configuration 打交道,要使用 Configuration.buildSessionFactory() 方法获得一个 ...
### 方法二:在 Annotation 中使用 @Column(updatable=false) 在使用 Annotation 配置时,我们可以使用 @Column(updatable=false) 注解来设置某些属性的更新权限。例如,我们可以设置 age 属性的更新权限为 false:...
### 在Hibernate中的数据库操作 #### Hibernate简介 Hibernate是一种开源的对象关系映射(ORM)框架,用于Java环境下的数据库操作。它允许开发人员将Java对象映射到关系型数据库中的表,并支持面向对象的方法来处理...
Hibernate 源代码分析 (一):设计属于我的 SessionFactory 和 ConnectionProvider ...通过这篇文章,我们可以了解到 Hibernate 框架的核心机制,掌握 Hibernate 框架的使用方法,提高自己的开发效率和质量。
在本文中,我们将深入探讨如何将Spring Boot框架与Hibernate ORM集成,特别是在不使用JPA(Java Persistence API)的情况下。Spring Boot以其便捷的自动配置和简化Java应用开发而广受欢迎,而Hibernate作为Java领域...
Struts和Hibernate是Java Web开发中的两个重要框架,它们在构建高效、可维护的Web应用程序时发挥着关键作用。这个“Struts+Hibernate项目”旨在为开发者提供一个学习和实践的平台,帮助他们快速理解这两种框架的集成...
这样,`EntityDao`接口和`EntityDaoImpl`实现类就可以使用`BaseEntity`作为泛型参数,确保方法适用于所有继承自`BaseEntity`的实体。 通过这种方式,Service层可以直接调用`EntityDao`接口的方法,而无需关心具体的...
Hibernate二级缓存是ORM框架Hibernate中的一个重要特性,它旨在提高数据访问效率,减少对数据库的直接操作,从而提升系统的响应速度。在大型数据库系统中,合理利用缓存机制能够显著优化性能,尤其是在高并发场景下...
} // 添加方法 public void addJob(JobsDemo job) { // 获得连接对象 session = HibernateSessionFactory.getCurrentSession(); // 开始事务 tr = session.beginTransaction(); // 保存对象 session.save(job); // ...
- `getCurrentSession()`方法则会在当前线程中获取一个Session,如果当前线程没有Session,则会自动创建一个新的Session。这种方式适用于需要跨多个方法调用的事务管理。 #### 四、Hibernate生命周期状态 - **瞬...