考虑到我选择的JPA(Hibernate实现),Spring和<在此处插入MVC框架-Struts 1,Struts 2,Spring
MVC,Stripes …>的开发框架,我要问这个问题。
我一直在思考我的实体层中的关系-
例如,我有一个包含许多订单行的订单实体。我已经设置好我的应用程序,以便它热切地加载每个订单的订单行。您是否认为这是解决如果将获取策略设置为false会遇到的惰性初始化问题的惰性方法?
我的看法是,在检索实体及其关联时,有以下几种选择:
使用“在视图中打开会话”模式在每个请求上创建会话,并在返回响应之前提交事务。
实现一个DTO(数据传输对象)层,以便我执行的每个DAO查询都返回正确初始化的DTO以达到我的目的。我不太喜欢这个选项,因为根据我的经验,我发现它创建了很多样板复制代码,并且变得难以维护。
不要在JPA中映射任何关联,这样我执行的每个查询都只会返回我感兴趣的实体-无论如何这可能会要求我拥有DTO,并且将很难维护,并且我认为破坏了拥有ORM的目的首先。
急切地获取所有(或大多数关联)-在上面的示例中,在检索订单时始终获取所有订单行。
所以我的问题是,您何时以及在什么情况下会使用这些选项中的哪一个?您是否始终坚持这样做的一种方式?
我会问一位同事,但我认为,即使我提到“公开会议视线”一词,也会被空白凝视:(我真正想要的是高级或经验丰富的开发人员的一些建议。
多谢你们!
我已经使用“视图中的打开会话”模式(即Spring实现)成功解决了所有懒惰的初始化问题。我使用的技术与您完全一样。
使用此模式可以使我完整地映射实体关系,而不必担心在dao中获取子实体。大多。在90%的情况下,该模式解决了视图中的延迟初始化需求。在某些情况下,您将必须“手动”初始化关系。这些案例很少见,在我的案例中总是涉及非常非常复杂的映射。
使用“在视图中打开实体管理器”模式时,正确定义实体关系(尤其是正确的传播和事务设置)非常重要。如果未正确配置这些对象,则在视图中延迟初始化某些实体时,将出现与关闭的会话相关的错误,并且由于会话已经关闭而失败。
我一定会选择选项1。有时可能需要选项2,但我绝对没有理由使用选项3。选项4也不是。急于获取所有内容会扼杀只需要列出某些父实体的一些属性(按顺序排列)的任何视图的性能。
在开发期间,由于初始化视图中的某些关系,将有N +
1个选择。但这不是丢弃模式的原因。只要解决这些问题,就可以解决这些问题,然后再将代码交付生产。使用OEMIV模式解决这些问题与使用任何其他模式一样容易:添加适当的dao或服务方法,修复控制器以调用其他finder方法,也许向数据库添加视图等。
我使用CXF Servlet公开了一些REST服务。然而,我遇到了这样的问题:一个类需要一个延迟加载的集合(不止一个列表)。我得到了这个: 我的cxf配置相当简单: 如何实现“在视图中打开会话”模式,以便在 Jackson 序列化对象时我的Hibernate会话可用?
我正在做一个项目,使用Hibernate进行持久化,使用Struts 2进行视图模式。 我的配置文件是: : < code > application context . XML : 我的问题是,在Struts 2的视图模式中,我无法保持Hibernate会话打开,这意味着当我尝试加载一些尚未用Hibernate初始化的数据(例如集合)时,我会得到<code>org.Hibernate。LazyI
我想通过编程(从关联菜单)打开某个视图,我该怎么做? 我可以使用e3兼容层显示如下视图: e4的方法是什么?
我可以使用EPartService打开视图或零件(请参见此处)。 这将把最后一个零件堆栈中的零件作为新选项卡显示。 我如何在分离模式下打开该部分?
下面是Spring3.x和Hibernate3.x上的一个假设情况 我在Spring有一个服务层,它调用3个DAO来构建一个模型。DAO 是事务性的(@Transactional),并且具有延迟加载的Hibernate集合。 该服务方法会导致一些更新,以及数据的获取。 典型的DAO方法如下- 我有以下关于OSIV的问题 - 1.在默认的AUTO模式下,此会话刷新(数据库更新)多少次? 2.是否可以
问题内容: 因此,我在这里有好几次见过人们使用和模式来读写文件。 例如: 我没有看到这些模式的文档,但是由于没有引发错误- 看起来使用起来非常合法。 它的作用是什么,使用vs和 vs之间有什么区别? 问题答案: 指文本模式。和和和与之间没有区别,因为默认为文本模式。 记录在这里: 默认模式为(打开以读取文本,为的同义词)。