What does sessionFactory.getCurrentSession() do? First, you can call it
as many times and anywhere you
like, once you get hold of your SessionFactory (easy thanks to
HibernateUtil). The getCurrentSession()
method always returns the "current" unit of work. Remember that we
switched the configuration option for this
mechanism to "thread" in hibernate.cfg.xml? Hence, the scope of the
current unit of work is the current Java
thread that executes our application. However, this is not the full
truth. A Session begins when it is first
needed, when the first call to getCurrentSession() is made. It is then
bound by Hibernate to the current
thread. When the transaction ends, either committed or rolled back,
Hibernate also unbinds the Session from
the thread and closes it for you. If you call getCurrentSession() again,
you get a new Session and can start a
new unit of work. This thread-bound programming model is the most
popular way of using Hibernate.
意思是说:
sessionFactory.getCurrentSession()可以完成一系列的工作,当调用时,
hibernate将session绑定到当前线程,事务结束后,hibernate
将session从当前线程中释放,并且关闭session。当再次调用getCurrentSession
()时,将得到一个新的session,并重新开始这一系列工作。
这样调用方法如下:
Session session = HibernateUtil.getSessionFactory().getCurrentSession();
session.beginTransaction();
Event theEvent = new Event();
theEvent.setTitle(title);
theEvent.setDate(theDate);
session.save(theEvent);
session.getTransaction().commit();
不需要close session了。
前提是改值设置为了thread.
1 getCurrentSession创建的session会和绑定到当前线程,而openSession不会。
2 getCurrentSession创建的线程会在事务回滚或事物提交后自动关闭,而openSession必须手动关闭
这里getCurrentSession本地事务(本地事务:jdbc)时 要在配置文件里进行如下设置
* 如果使用的是本地事务(jdbc事务)
<property name="hibernate.current_session_context_class">thread</property>
* 如果使用的是全局事务(jta事务)
<property name="hibernate.current_session_context_class">jta</property>
getCurrentSession () 使用当前的session
openSession() 重新建立一个新的session
在一个应用程序中,如果DAO 层使用Spring 的hibernate 模板,通过Spring 来控制session 的生命周期,则首选getCurrentSession ()。
使用Hibernate的大多数应用程序需要某种形式的“上下文相关的” session,特定的session在整个特定的上下文范围内始终有效。然而,对不同类型的应用程序而言,要为什么是组成这种“上下文”下一个定义通常 是困难的;不同的上下文对“当前”这个概念定义了不同的范围。在3.0版本之前,使用Hibernate的程序要么采用自行编写的基于 ThreadLocal的上下文session,要么采用HibernateUtil这样的辅助类,要么采用第三方框架(比如Spring或Pico), 它们提供了基于代理(proxy)或者基于拦截器(interception)的上下文相关session。
从3.0.1版本开 始,Hibernate增加了SessionFactory.getCurrentSession()方法。一开始,它假定了采用JTA事务,JTA事务 定义了当前session的范围和上下文(scope and context)。Hibernate开发团队坚信,因为有好几个独立的JTA TransactionManager实现稳定可用,不论是否被部署到一个J2EE容器中,大多数(假若不是所有的)应用程序都应该采用JTA事务管理。 基于这一点,采用JTA的上下文相关session可以满足你一切需要。
更好的是,从3.1开 始,SessionFactory.getCurrentSession()的后台实现是可拔插的。因此,我们引入了新的扩展接口 (org.hibernate.context.CurrentSessionContext)和新的配置参数 (hibernate.current_session_context_class),以便对什么是“当前session”的范围和上下文(scope and context)的定义进行拔插。
请参阅 org.hibernate.context.CurrentSessionContext接口的Javadoc,那里有关于它的契约的详细讨论。它定义 了单一的方法,currentSession(),特定的实现用它来负责跟踪当前的上下文session。Hibernate内置了此接口的两种实现。
org.hibernate.context.JTASessionContext - 当前session根据JTA来跟踪和界定。这和以前的仅支持JTA的方法是完全一样的。详情请参阅Javadoc。
org.hibernate.context.ThreadLocalSessionContext - 当前session通过当前执行的线程来跟踪和界定。详情也请参阅Javadoc。
这 两种实现都提供了“每数据库事务对应一个session”的编程模型,也称作每次请求一个session。Hibernate session的起始和终结由数据库事务的生存来控制。假若你采用自行编写代码来管理事务(比如,在纯粹的J2SE,或者 JTA/UserTransaction/BMT),建议你使用Hibernate Transaction API来把底层事务实现从你的代码中隐藏掉。如果你在支持CMT的EJB容器中执行,事务边界是声明式定义的,你不需要在代码中进行任何事务或 session管理操作。请参阅第 11 章 事务和并发一节来阅读更多的内容和示例代码。
hibernate.current_session_context_class 配置参数定义了应该采用哪个org.hibernate.context.CurrentSessionContext实现。注意,为了向下兼容,如果未 配置此参数,但是存在org.hibernate.transaction.TransactionManagerLookup的配 置,Hibernate会采用org.hibernate.context.JTASessionContext。一般而言,此参数的值指明了要使用的实 现类的全名,但那两个内置的实现可以使用简写,即"jta"和"thread"。
1、getCurrentSession()与openSession()的区别?
* 采用getCurrentSession()创建的session会绑定到当前线程中,而采用openSession()
创建的session则不会
* 采用getCurrentSession()创建的session在commit或rollback时会自动关闭,而采用openSession()
创建的session必须手动关闭
2、使用getCurrentSession()需要在hibernate.cfg.xml文件中加入如下配置:
* 如果使用的是本地事务(jdbc事务)
<property name="hibernate.current_session_context_class">thread</property>
* 如果使用的是全局事务(jta事务)
<property name="hibernate.current_session_context_class">jta</property>
利于ThreadLocal模式管理Session
早在Java1.2推出之时,Java平台中就引入了一个新的支持:java.lang.ThreadLocal,给我们在编写多线程程序
时提供了一种新的选择。ThreadLocal是什么呢?其实ThreadLocal并非是一个线程的本地实现版本,它并不是一个Thread,
而是thread local variable(线程局部变量)。也许把它命名为ThreadLocalVar更加合适。线程局部变量(ThreadLocal)
其实的功用非常简单,就是为每一个使用某变量的线程都提供一个该变量值的副本,是每一个线程都可以独立地改变自己的副本,
而不会和其它线程的副本冲突。从线程的角度看,就好像每一个线程都完全拥有一个该变量。
ThreadLocal是如何做到为每一个线程维护变量的副本的呢?其实实现的思路很简单,在ThreadLocal类中有一个Map,
用于存储每一个线程的变量的副本。比如下面的示例实现(为了简单,没有考虑集合的泛型):
public class HibernateUtil {
public static final ThreadLocal session =new ThreadLocal();
public static final SessionFactory sessionFactory;
static {
try {
sessionFactory = new Configuration().configure().buildSessionFactory();
} catch (Throwable ex) {
throw new ExceptionInInitializerError(ex);
}
}
public static Session currentSession () throws HibernateException {
Session s = session.get ();
if(s == null) {
s = sessionFactory.openSession ();
session.set(s);
}
return s;
}
public static void closeSession() throws HibernateException {
Session s = session.get ();
if(s != null) {
s.close();
}
session.set(null);
}
}
openSession() 与 getCurrentSession() 有何不同和关联呢?
在 SessionFactory 启动的时候, Hibernate 会根据配置创建相应的 CurrentSessionContext ,在 getCurrentSession() 被调用的时候,实际被执行的方法是 CurrentSessionContext.currentSession() 。在 currentSession() 执行时,如果当前 Session 为空, currentSession 会调用 SessionFactory 的 openSession 。所以 getCurrentSession() 对于 Java EE 来说是更好的获取 Session 的方法。
转载地址:http://hi.baidu.com/xuchao_duizhang/blog/item/652a66b5807b60dc36d3cad1.html
相关推荐
- `hibernate.current_session_context_class`:设置当前Session的上下文类,这里是`thread`,意味着每个线程都有一个独立的Session实例。 5. **连接池配置(C3P0)**: - `hibernate.c3p0.*`:C3P0是一个开源的...
- `<property name="hibernate.current_session_context_class">`: 当前Session上下文,例如`thread`表示每个线程绑定一个Session。 5. **其他高级配置**: - `<property name="hibernate.show_sql">`: 是否显示...
12. **hibernate.current_session_context_class** 定义当前Session上下文的实现,如`thread`(默认,每个线程一个Session)或`managed`(在容器管理的事务中使用)。 13. **hibernate.id.new_generator_mappings*...
- `hibernate.current_session_context_class`: 当前Session上下文类,可以是`thread`(线程绑定)或`jta`(Java Transaction API)。 4. **日志配置** - `hibernate.show_sql`: 如果设置为`true`,Hibernate将在...
10. **hibernate.current_session_context_class**:定义当前Session上下文类,如`thread`(线程绑定)或`managed`(容器管理)。 11. **hibernate.connection.pool_size**:设置连接池的大小,以提高性能。 12. *...
可以设置`current_session_context_class`属性来选择Session的上下文。例如: ```xml <session-factory> <!-- Other properties --> <property name="current_session_context_class">thread </session-factory...
- `current_session_context_class`: 当前会话上下文类,比如`thread`表示线程绑定的会话。 5. **性能优化** - `hibernate.show_sql`: 是否在控制台打印执行的SQL语句,通常用于调试。 - `hibernate.format_sql`...
- `hibernate.current_session_context_class`:确定了`Session`的上下文共享范围,可选值有`thread`(线程共享)、`jta`(事务共享),或自定义实现类,用于适应不同的应用架构需求。 综上所述,Hibernate配置的...
8. **hibernate.current_session_context_class**:定义当前Session上下文的管理方式,例如ThreadLocal或JTA。 通过这些课件,学习者可以深入了解Hibernate的工作原理,如何配置其主要属性,以及如何根据项目的具体...
如果配置文件中没有指定 CURRENT_SESSION_CONTEXT_CLASS 属性,那么将使用默认的实现。 SessionFactory 和 ConnectionProvider 是 Hibernate 框架中的两个核心组件,了解它们的实现机制对于深入了解 Hibernate 的...
- `current_session_context_class`: 定义当前Session的上下文,如`thread`(每个线程一个Session)或`managed`(容器管理的Session)。 5. **缓存配置** - `cache.region.factory_class`: 缓存提供商的全限定...
9. **hibernate.current_session_context_class**:定义当前Session的上下文管理,如`thread`或`jta`。 10. **hibernate.format_sql**:如果设置为true,生成的SQL将格式化输出,便于阅读。 **详细知识点:** ...
<property name="current_session_context_class">thread <mapping resource="domain/Person.hbm.xml"/> </session-factory> </hibernate-configuration> ``` 在上述配置中,指定了 MySQL 数据库的连接信息,并...
<property name="hibernate.current_session_context_class">thread ``` 然后,在程序中通过 sessionFactory.getCurrentSession() 获得线程绑定 Session 对象。 二级缓存 Hibernate 的二级缓存可以将数据库或者...
<prop key="hibernate.current_session_context_class">jta <prop key="hibernate.transaction.manager_lookup_class">org.hibernate.transaction.WebSphereExtendedJTATransactionLookup <prop key="hibernate....
3. **会话工厂配置**:如`<property name="hibernate.current_session_context_class">thread</property>`,指定当前线程的Session管理方式。 4. **实体映射配置**:通过`<mapping resource="com/example/Entity....
- `current_session_context_class`:设置当前线程中的Session实例,这里使用`thread`表示每个线程有一个独立的Session实例。 - `cache.provider_class`:设置缓存提供者类,默认不开启缓存。 ##### 4. 实体类...
<property name="current_session_context_class">thread <!-- Disable the second-level cache --> <property name="cache.provider_class">org.hibernate.cache.NoCacheProvider <!-- Echo all executed SQL...
在 currentSession() 执行时,如果当前 Session 为空,currentSession 会调用 SessionFactory 的 openSession。 因此,getCurrentSession() 对于 Java EE 来说是更好的获取 Session 的方法。 Session 的关闭 在 ...