2012-11-28 160 views
0

我正在开发一个Web应用程序,其中的模型由一个Group组成,其中包含UsersList。 HTTP请求会显示GroupUsers加载了FetchType.LAZY,因为我不想让他们马上就来。将Group保存到HTTP session中,并关闭Hibernate Session。然后,应用程序通过显示Group名称和说明进行响应。然后,新的HTTP请求可能会显示来自组的一些用户。 GroupHTTP Session中拉出,应用程序尝试访问该列表。 Hibernate是否会抛出异常,因为每个User的代理都与以前关闭的Hibernate Session绑定?如何在HTTP会话中跨HTTP请求进行延迟加载?HTTP请求之间的休眠会话

回答

1

你不应该把用户也不组(作为对象)的会话。最好的方案是将组ID添加到会话中,并在必要时加载组和用户。

担心表现?让Hibernate二级缓存解决这个问题。如果您正确配置对象映射,缓存应该甚至支持按组检索所有用户,例如:

<class name="Group" table="..."> 
    <cache .../> 

    <bag name=users" ...> 
    <cache ....> 
    ... 
    </bag> 
</class> 
1

我不认为你需要或应该将它存储在会话中。当你需要关联时,你可以查询它。


更新

Eager装载副歌,除非集合大小是小还是易于管理。例如,您有一个Groups,每个组中有少量的用户。

如果您有反向映射,则可以使用group id在随后的调用中查询用户列表。

+0

并获取渴望? –

+0

我建议避免使用Eager,除非您确定相关集合相当小(或至少与实际有效负载相比)。 – ch4nd4n

0

您是否考虑过在视图中打开会话?

Open Session In View

+0

我没有,我会研究这个。谢谢。 –

+0

当请求已经被提供并且列表将在HTTP调用之间展开/折叠时,在这种情况下,在视图中打开会话过滤器不会有帮助。在视图过滤器中打开会话通常是制作中的问题:) – ch4nd4n

+0

为什么它不起作用?可以通过将Hibernate会话作为HTTP会话的一部分进行维护来使用开放会话,这正是应用程序管理的当前会话模式所做的。 –