您的位置:首页 > 编程语言 > Java开发

spring实现将hibernate的session绑定到请求的方法

2009-10-21 11:25 441 查看
<!--
/* Font Definitions */
@font-face
{font-family:宋体;
panose-1:2 1 6 0 3 1 1 1 1 1;
mso-font-alt:SimSun;
mso-font-charset:134;
mso-generic-font-family:auto;
mso-font-pitch:variable;
mso-font-signature:3 135135232 16 0 262145 0;}
@font-face
{font-family:"/@宋体";
panose-1:2 1 6 0 3 1 1 1 1 1;
mso-font-charset:134;
mso-generic-font-family:auto;
mso-font-pitch:variable;
mso-font-signature:3 135135232 16 0 262145 0;}
/* Style Definitions */
p.MsoNormal, li.MsoNormal, div.MsoNormal
{mso-style-parent:"";
margin:0cm;
margin-bottom:.0001pt;
text-align:justify;
text-justify:inter-ideograph;
mso-pagination:none;
font-size:10.5pt;
mso-bidi-font-size:12.0pt;
font-family:"Times New Roman";
mso-fareast-font-family:宋体;
mso-font-kerning:1.0pt;}
/* Page Definitions */
@page
{mso-page-border-surround-header:no;
mso-page-border-surround-footer:no;}
@page Section1
{size:595.3pt 841.9pt;
margin:72.0pt 90.0pt 72.0pt 90.0pt;
mso-header-margin:42.55pt;
mso-footer-margin:49.6pt;
mso-paper-source:0;
layout-grid:15.6pt;}
div.Section1
{page:Section1;}
-->

项目中用到了
OpenSessionInViewFilter
来将
hibernate

session
对象绑定到每个请求线程中,如此,只要在一个请求过程中与
session
发生过关联的对象(也就是持久态对象)不管事务提交没提交,直到请求结束该对象都会一直保持持久态。

知其然更要知其所有然,那么
spring
是如何实现这个绑定,又是如何用它来进行事务管理的呢?

通过查看
spring
源代码可以发现:在
OpenSessionInViewFilter
中有个
doFilterInternal
方法,在这个方法里面有段这样的代码:

Session session =
getSession(sessionFactory);

TransactionSynchronizationManager.bindResource(sessionFactory, new
SessionHolder(session));

看到这里不难发现,每个请求被这个
filter
拦截的时候都会有一个
session

TransactionSynchronizationManager.bindResource
()方法保存了起来,那么这个
session
被保存到了那里呢?通过查看
bindResource
()这个方法可以发现该
session
对象其实是被
sessionHolder(session)
包装后以
sessionFactory

key

sessionholder

value
保存到了一个
map
对象中,
map
对象又被保存到了
TransactionSynchronizationManager
类的一个
ThreadLocal
类型的属性中,借由将
session
保存到
threadlocal
中实现了将
session
绑定到请求的功能。


spring

HibernateTransactionManager
中通过调用

SessionHolder sessionHolder =
(SessionHolder)TransactionSynchronizationManager.getResource(getSessionFactory());
方法来获取请求开始的时候保存到请求线程的
session
,从而实现了
session
的生命周期在整个请求过程中都有效的功能

真不敢想象要是Java没了threadLoacl spring该怎么办。。。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐