mrb*_*lah 3 java orm spring hibernate
如果您使用Dao方法(伪代码)进行调用:
return ..getHibernateTemplate(get by id);
现在说该实体有一个延迟加载的集合.一旦你使用hibernateTemplate助手方法从你的Dao返回,为什么会话保持在范围内并允许你延迟加载一个集合?
会话是基于每个请求在全局级别初始化和提交的吗?
更新
请解释一下"getcurrentsession"的确切调用,以及它何时实际关闭/提交?
根据我的理解,spring框架必须处理会话生命周期,它在哪里执行此操作?请求生命周期中的什么时候?
它也在处理工作单元,在哪里/如何?
一旦你使用hibernateTemplate助手方法从你的Dao返回,为什么会话保持在范围内并允许你延迟加载一个集合?
因为Session尚未关闭,因此您的实体仍然是持久的(而不是Detached对象状态).只要您的实体尚未分离,您就可以延迟加载集合和代理.见第10.1章.Hibernate对象说明了这些状态的更多细节(理解它们和使用的术语非常重要).
会话是基于每个请求在全局级别初始化和提交的吗?
对于Web应用程序,通常是每个请求.正如javadoc中提到的HibernateTemplate:
延迟加载也可以在事务内或OpenSessionInViewFilter/Interceptor中使用打开的Hibernate Session.
如果你看一下OpenSessionInViewFilteror 的javadoc OpenSessionInViewInterceptor,你会发现它们略有不同,但它们都将Hibernate Session绑定到线程以进行整个请求处理,并提供"Open Session in View"模式的实现.
请解释一下"getcurrentsession"的确切调用,以及它何时实际关闭/提交?
你可以查看源代码并使用调试器,你知道:)看看HibernateTemplate,更确切地说是doExecute()方法,这是获得会话的地方.对于close/commit,请看前面提到的OpenSessionInViewFilter/ Interceptor,两者都有为此目的的方法.
根据我的理解,spring框架必须处理会话生命周期,它在哪里执行此操作?请求生命周期中的什么时候?
我想我已经介绍了这一部分:会话是在请求开始时创建的,最后是关闭的.
它也在处理工作单元,在哪里/如何?
我不确定能得到这个.对我来说,Hibernate的Session 是一个工作单元模式的实现.所以这个问题实际上与前一个问题相同.
PS:我提供了一些链接,表明一切都是清楚记录的.Spring和Hibernate有非常好的文档和javadoc.利用它,自己查看它们,自己查看代码,使用调试器,你将学到更多东西.
| 归档时间: | 
 | 
| 查看次数: | 2464 次 | 
| 最近记录: |