Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/spring/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 具有延迟加载的MVC_Java_Spring_Hibernate_Transactions_Zk - Fatal编程技术网

Java 具有延迟加载的MVC

Java 具有延迟加载的MVC,java,spring,hibernate,transactions,zk,Java,Spring,Hibernate,Transactions,Zk,纠正我,如果这是一个确切的重复,我知道这个话题经常被讨论,但无法找到一个明确的答案 问题: 在MVC webapp中处理Hibernate对象的最佳实用解决方案是什么 详细信息: 我正在使用Hibernate,希望尽可能利用延迟加载。 我在一个MVC风格的网络应用程序中工作。 我讨厌延迟加载初始化异常。 我讨厌在事务之间重新连接Hibernate对象 选项: 急切地装载一切 解决了延迟初始化问题,但使我的查询更大 使用一些“在视图中打开会话”的概念 我喜欢它的简单 对象仍然需要重新连接,并

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

问题:

在MVC webapp中处理Hibernate对象的最佳实用解决方案是什么

详细信息:

我正在使用Hibernate,希望尽可能利用延迟加载。
我在一个MVC风格的网络应用程序中工作。
我讨厌延迟加载初始化异常。
我讨厌在事务之间重新连接Hibernate对象

选项:

  • 急切地装载一切
    • 解决了延迟初始化问题,但使我的查询更大
  • 使用一些“在视图中打开会话”的概念
    • 我喜欢它的简单
    • 对象仍然需要重新连接,并且在AJAXy设置中,需要非常频繁地重新连接
    • 为每个请求打开一个会话
  • 在离开交易前“触摸”我需要的物品
    • 充其量似乎很脆弱。。单调乏味
  • 创建不同的、简化的“分离”对象,这样视图就不会看到真正的Hibernate对象
    • 这些可能比完整的Hibernate对象更简单,所以它不像模型的完整负载
    • 我在一些地方听到过这样的建议,但似乎更多的是责任/代码/工作
  • 当我想要与Hibernate对象交互时,打开会话。
    • 这可以很好地包装在Spring服务层中,但有时似乎有些过分。例如:我想要
      hibernateObject.getRelatedObjects()
      ,但需要说类似
      springService.getRelatedObjects(hibernateObject)
  • 我错过什么了吗?
    我有没有想过呢?
    我有没有想过

    PS:

    对于web框架,我正在使用ZK,但并不真正想要ZK特定的答案。

    我也在使用Spring,我对Spring特有的答案很满意,因为它无处不在。

    使用4-ish-不要在视图中使用open session,不要让您的hibernate实体一直冒泡到视图,而是让转换器在hibernate实体和域对象或“视图bean”之间进行转换,具体取决于您希望如何使用它


    我认为Hibernate实体只是一种持久性策略,而不是域模型或UI表示。

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

    视图应该通过控制器访问模型,但直接使用Hibernate对象是在混合层。IMO数据访问应该是模型下面的另一层。即使在xml中对实体进行了注释或定义,它们也与模型本身是分开的

    引入封装Hibernate逻辑的Facade或Manager,并通过控制器的服务契约将其公开,返回表示这些实体的有意义对象。如果有的话,我会选择选项4。

    有三种方法:

    对属性使用即时获取加载:如果您有一个大数据表,这可能是一个问题

    使用名为OpenSessionInView的筛选器:此筛选器将保持会话打开,直到网页满负荷。如果在此加载中请求了任何hibernate对象,则会话将被打开,并将避免延迟加载异常

    用户VOs(可值对象):在应用程序中,将有2种对象。在持久性层和业务层之间传递的对象,以及视图层的对象。例如,UserVO和UserModel。vo将用于在视图层和业务层之间传输信息。在您的业务实现中,您将使用vo填充模型对象以将其发送到持久层。使用此模式,您将不会有更多的延迟加载异常,因为在必要时,所有需要的信息都将填充到vo对象中

    一些参考资料:




    谢谢你。这需要更多的代码和工作,但我认为这将使应用程序更干净、更可测试。如果我能同时接受你的和@Bedwyr的,我会随机选择一个。@Sean无需担心,很高兴能提供帮助:)干杯,Bedwyr,我想我会采取这种方法。这是一个多一点的代码,但是视图和模型的分离应该是值得的。我同意这个答案,并对它进行了升级,只想添加一段代码,你可能会觉得很方便。这是一个可变深度复印机,它取决于弹簧,但重量比完整的绘图解决方案(如推土机)轻。还有一个Hibernate解毒剂:option 4 DTO模式不是反模式吗?