我正在开发一个 Web 应用程序,其中模型包含 a Group
,其中包含List
许多Users
. 一个 HTTP 请求来显示Group
. 这些Users
都加载了,FetchType.LAZY
因为我不想要它们。被Group
保存到HTTP session
并且Hibernate Session
被关闭。然后应用程序通过显示Group
名称和描述来响应。然后可能会出现一个新的 HTTP 请求以显示该组中的一些用户。从Group
中提取HTTP Session
并且应用程序尝试访问该列表。Hibernate 不会抛出异常,因为每个代理User
都与Hibernate Session
之前关闭的代理相关联?如何在 HTTP 会话中跨 HTTP 请求进行延迟加载?
问问题
702 次
3 回答
1
您不应将用户或组(作为对象)放入会话中。最好的方案是将组 ID 放入会话中,并在必要时加载组和用户。
担心性能?让 Hibernate 二级缓存解决这个问题。如果您正确配置对象映射,缓存甚至应该支持按组检索所有用户,例如:
<class name="Group" table="...">
<cache .../>
<bag name=users" ...>
<cache ....>
...
</bag>
</class>
于 2012-11-28T17:01:00.750 回答
1
我认为您不需要或不应该将其存储在会话中。当您需要关联时,您可以查询它。
更新
避免Eager
加载,除非集合大小很小或可管理。例如,您Groups
在每个组中有少量用户。
如果您有反向映射,您可以group id
在后续调用中使用查询用户列表。
于 2012-11-28T15:47:21.573 回答
0
您是否考虑过在视图中打开会话?
于 2012-11-28T16:52:20.173 回答