【发布时间】:2014-01-24 15:56:06
【问题描述】:
在 Spring MVC 应用程序中处理延迟加载对象的最佳解决方案是什么?我已经对该主题进行了一些搜索,并找到了以下解决方案:
在视图中打开会话:为每个请求打开一个会话并在视图呈现后关闭它。这个解决方案的问题是我需要在 Spring MVC 模型之外延迟加载对象(例如 Junit 测试用例)。关于此解决方案的另一个讨论问题是异常处理。如果事务在视图渲染过程中抛出异常怎么办?
显式打开会话:每当我需要延迟加载对象时显式打开会话。实际上这个解决方案应该可行,但我认为这不是正确的方法。
使用 AOP: 创建一个在会话中包装延迟加载方法的切面。这可能是一个解决方案,但我不知道我应该在应用程序的哪个级别定义 poitcuts
创建自定义查询:为延迟加载创建查询和为急切加载创建查询。这个解决方案确实有效,但在我看来,延迟加载模式的应用是错误的
【问题讨论】:
-
查看这篇关于 OSIV 优点/缺点的帖子 blog.jhades.org/open-session-in-view-pattern-pros-and-cons
-
使用自定义查询的问题是它们强制连接到相关对象上,这并不总是最佳解决方案。有时,对主要对象进行 1 次查询,对相关对象进行 N 次单独查询会更有效。
-
此外,将查询与延迟加载分开很好,因为这意味着您可以使用单一方法进行延迟加载(例如: loadRelationsRequiredByDefault() ),可以被许多不同的查询重用返回同一个对象(或对象列表)。
标签: java spring hibernate spring-mvc