一个Session
就是个单一的工作单元。我们暂时让事情简单一些,并假设HibernateSession
和数据库事务是一一对应的。为了让我们的代码从底层的事务系统中脱离出来(此例中是JDBC,但也可能是JTA),我们使用Hibernate Session
中的Transaction
API。
sessionFactory.getCurrentSession()
是干什么的呢?首先,只要你持有SessionFactory
(幸亏我们有HibernateUtil
,可以随时获得),大可在任何时候、任何地点调用这个方法。getCurrentSession()
方法总会返回“当前的”工作单元。记得我们在hibernate.cfg.xml
中把这一配置选项调整为"thread"了吗?因此,因此,当前工作单元被绑定到当前执行我们应用程序的Java线程。但是,这并非是完全准确的,你还得考虑工作单元的生命周期范围 (scope),它何时开始,又何时结束.
Session
在第一次被使用的时候,即第一次调用getCurrentSession()
的时候,其生命周期就开始。然后它被Hibernate绑定到当前线程。当事务结束的时候,不管是提交还是回滚,Hibernate会自动把Session
从当前线程剥离,并且关闭它。假若你再次调用getCurrentSession()
,你会得到一个新的Session
,并且开始一个新的工作单元。这种线程绑定(thread-bound)的编程模型(model)是使用Hibernate的最广泛的方式,因为它支持对你的代码灵活分层(事务划分可以和你的数据访问代码分离开来,在本教程的后面部分就会这么做)。