spring如何允许延迟加载?

mrb*_*lah 3 java orm spring hibernate

如果您使用Dao方法(伪代码)进行调用:

return ..getHibernateTemplate(get by id);

现在说该实体有一个延迟加载的集合.一旦你使用hibernateTemplate助手方法从你的Dao返回,为什么会话保持在范围内并允许你延迟加载一个集合?

会话是基于每个请求在全局级别初始化和提交的吗?

更新

请解释一下"getcurrentsession"的确切调用,以及它何时实际关闭/提交?

根据我的理解,spring框架必须处理会话生命周期,它在哪里执行此操作?请求生命周期中的什么时候?

它也在处理工作单元,在哪里/如何?

Pas*_*ent 6

一旦你使用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.利用它,自己查看它们,自己查看代码,使用调试器,你将学到更多东西.