MVC随着延迟加载(MVC With Lazy Loading)

2019-07-18 07:20发布

纠正我,如果这是一个确切的重复,我知道这个话题经常被讨论,但无法找到一个明确的答案。

问题:

什么是一个Web应用程序的MVC处理休眠对象的最佳实践的解决方案?

细节:

我使用Hibernate和想去的地方可能利用延迟加载。
我在一个MVC Web应用程序样式的工作。
我讨厌越来越懒加载初始化例外。
我讨厌不得不重新安装事务之间的Hibernate对象。

选项:

  1. 贪婪加载一切
    • 解决了延迟初始化的问题,但让我查询更大
  2. 使用一些“打开会话视图中的”概念
    • 我喜欢它的简单性
    • 对象仍然需要重新连接,并在AJAXy设置,屡有
    • session打开时为每个请求
  3. “触摸”的项目我离开交易之前需要
    • 似乎站不住脚充其量..和繁琐
  4. 创建不同的,简化的,“超脱”对象,所以认为不会看到真正的Hibernate对象
    • 这可能是比完整的Hibernate对象更简单,所以它不喜欢这种型号的满负荷跃跃欲试
    • 我听说过这个建议的地方,但似乎只是更多的责任/代码/工作
  5. 当过我想要使用Hibernate对象交互打开一个会话。
    • 这可以在Spring服务层包裹起来非常好听,但有时似乎过高。 例如:我想hibernateObject.getRelatedObjects()但需要说类似springService.getRelatedObjects(hibernateObject)

我缺少的东西吗?
我有过想的东西呢?
有我在,以为事情?

PS:

对于Web框架我使用ZK,但真的不希望ZK具体的答案。
我还使用Spring和不介意让一个Spring明确的答案,因为它是如此的普遍。

Answer 1:

使用四十岁上下 - 不要在视图中使用公开会议,没有你的Hibernate实体泡沫一路攀升到视图,而不是取决于有你如何在休眠实体和你的域对象或“视图bean”之间转换的变压器要解决它。

我觉得休眠实体的只是一个持久化策略不是域模型或UI表示。



Answer 2:

有三种方法:

如果你有一个大的数据表可能是一个问题。

该过滤器将保持该会话开到你的网页的满负荷。 如果有任何休眠对象是在这个负载要求,会议将被打开,将避免延迟加载异常。

在你的应用程序中,将有2类型的对象。 目的是持久和业务层之间传递,并为你的对象视图层。 例如,UserVO和的usermodel。 甲VO将被用来运输视图和业务层之间的信息。 在您的业务实现,你会用画外音来填充模型对象给你持久层来发送。 使用这种模式,你不会有更多的延迟加载异常,因为所有需要的信息将在你的VO对象是在必要时填写。


OpenSessionInView
渴望获取负载
Hibernate的性能提示



Answer 3:

混合数据访问层表示层是一个设计问题。

您认为应该通过一个控制器访问模式,但通过使用Hibernate对象直接你的混合层。 国际海事组织数据访问应该是型号下面的另一个层。 即使你的实体注解或XML定义他们从模型本身是分开的。

引入门面或封装休眠逻辑一个管理器,并通过控制器的服务合同的揭露它,并返回表示这些实体有意义的对象。 如果有,我会去选择4。



文章来源: MVC With Lazy Loading