hibernate为什么要有session
2个回答
展开全部
这个是框架开发者设计的,没有为什么,只是把原生的java连接数据库的代码,和一些常用的操作进行了一层封装,使开发人员使用更简单,下面再详细介绍一下Session:
(1)
单线程的,短寿命的对象,代表了一次会话的过程。实际上是把一个JDBC
Connection
打包
了,它可以包含一些持久化对象的缓存看作介于数据连接与事物管理一种中间接口.
在
hibernate
的设计者中.他们将session看作介于数据连接与事物管理的一种中间接口或者想象成一个持久对象的缓冲区
hibernate能检测到这些持久对象的改变,并及时刷新数据库
(2)
每一个Session实例和一个
数据库事务
绑定
通常将每一个Session实例和一个数据处理库事务绑定
就是说,每执行一个数据库事务(操作),都应该先创建一个新的Session实例.
如果事务执行中出现异常,应该撤消事务.
不论事务执行成功与否,最后都应该调用Session的close()方法,从而释放Session实例占用的资源.
(3)
如何获得
Session对象
首先创建SessionFactory对象
应用服务器
如果访问多个数据源时,则应该产生多个SessionFactory;
但是仅仅为了服务与某个请求时,不要创建一个新的SessionFactory,因为创建SessionFactory需要消耗大量的资源.
然后根据SessionFactory再创建Session对象
(1)
单线程的,短寿命的对象,代表了一次会话的过程。实际上是把一个JDBC
Connection
打包
了,它可以包含一些持久化对象的缓存看作介于数据连接与事物管理一种中间接口.
在
hibernate
的设计者中.他们将session看作介于数据连接与事物管理的一种中间接口或者想象成一个持久对象的缓冲区
hibernate能检测到这些持久对象的改变,并及时刷新数据库
(2)
每一个Session实例和一个
数据库事务
绑定
通常将每一个Session实例和一个数据处理库事务绑定
就是说,每执行一个数据库事务(操作),都应该先创建一个新的Session实例.
如果事务执行中出现异常,应该撤消事务.
不论事务执行成功与否,最后都应该调用Session的close()方法,从而释放Session实例占用的资源.
(3)
如何获得
Session对象
首先创建SessionFactory对象
应用服务器
如果访问多个数据源时,则应该产生多个SessionFactory;
但是仅仅为了服务与某个请求时,不要创建一个新的SessionFactory,因为创建SessionFactory需要消耗大量的资源.
然后根据SessionFactory再创建Session对象
展开全部
你好,getcurrentsession得到的session是和事务绑定的session,所以:
1,要用getcurrentsession生产的session,就必须有事务环境,意思就是你必须在调用session方法之前,session.begintransaction();就算你只是get或者query
2,在事务提交之后,即session.gettransaction().commit()之后,session自动关闭,所以你用getcurrentsession,只需要commit事务,不要去调用session.close()
3,你用的是ssh,spring为hibernate的current_session_context_class配置了一个springsessioncontext来帮你管理getcurrentsession中的session,所以,你在opensessioninview的时候,spring就自动的帮你打开了session——>你在执行用aop包装的事务的时候,事务就开启了——>执行你的业务方法——>提交事务(注意,hibernate管理的getcurrentsession在提交事务的时候才会关闭session,而spring提供的这个springsessioncontext不会)——>opensessioninview关闭session。
从上面的执行流程可以看出,你在ssh集成的时候,如果用的是getcurrentsession的集成方式,就不能设置hibernate的current_session_context_class为thread,而应该空着,让spring帮你。
1,要用getcurrentsession生产的session,就必须有事务环境,意思就是你必须在调用session方法之前,session.begintransaction();就算你只是get或者query
2,在事务提交之后,即session.gettransaction().commit()之后,session自动关闭,所以你用getcurrentsession,只需要commit事务,不要去调用session.close()
3,你用的是ssh,spring为hibernate的current_session_context_class配置了一个springsessioncontext来帮你管理getcurrentsession中的session,所以,你在opensessioninview的时候,spring就自动的帮你打开了session——>你在执行用aop包装的事务的时候,事务就开启了——>执行你的业务方法——>提交事务(注意,hibernate管理的getcurrentsession在提交事务的时候才会关闭session,而spring提供的这个springsessioncontext不会)——>opensessioninview关闭session。
从上面的执行流程可以看出,你在ssh集成的时候,如果用的是getcurrentsession的集成方式,就不能设置hibernate的current_session_context_class为thread,而应该空着,让spring帮你。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询