Java 具有延迟加载的MVC
纠正我,如果这是一个确切的重复,我知道这个话题经常被讨论,但无法找到一个明确的答案 问题: 在MVC webapp中处理Hibernate对象的最佳实用解决方案是什么 详细信息: 我正在使用Hibernate,希望尽可能利用延迟加载。Java 具有延迟加载的MVC,java,spring,hibernate,transactions,zk,Java,Spring,Hibernate,Transactions,Zk,纠正我,如果这是一个确切的重复,我知道这个话题经常被讨论,但无法找到一个明确的答案 问题: 在MVC webapp中处理Hibernate对象的最佳实用解决方案是什么 详细信息: 我正在使用Hibernate,希望尽可能利用延迟加载。 我在一个MVC风格的网络应用程序中工作。 我讨厌延迟加载初始化异常。 我讨厌在事务之间重新连接Hibernate对象 选项: 急切地装载一切 解决了延迟初始化问题,但使我的查询更大 使用一些“在视图中打开会话”的概念 我喜欢它的简单 对象仍然需要重新连接,并
我在一个MVC风格的网络应用程序中工作。
我讨厌延迟加载初始化异常。
我讨厌在事务之间重新连接Hibernate对象 选项:
- 解决了延迟初始化问题,但使我的查询更大
- 我喜欢它的简单
- 对象仍然需要重新连接,并且在AJAXy设置中,需要非常频繁地重新连接
- 为每个请求打开一个会话
- 充其量似乎很脆弱。。单调乏味
- 这些可能比完整的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模式不是反模式吗?