我对Spring很陌生,我想更多地了解会话。我已经使用Hibernate注释实体映射了一个遗留数据库,并构建了几个服务对象来获取,检索等。我的实体还包含其他实体(通过外键映射)和实体集。当我遍历我的服务中的权利图时,我没有问题。我的服务包装在TransactionProxyFactoryBean中,所以一切都应该是好的。
因此,在我的View Controller中,我从服务中请求了一堆实体。但是当我遍历视图控制器中的实体图形时(例如显示用户状态的国家名称,状态和国家都是延迟加载的实体),Hibernate会话已经关闭,我得到一个“LazyInitializationException:无法初始化代理 - 没有会话“
我不希望我的服务急切地获取数据,因为我的图表很深,甚至可以使用循环引用,因此会消耗大量RAM。我也不想明确地涉及我将在服务中显示的部分,因为这意味着我将不得不一遍又一遍地复制/粘贴写入类似的服务。所以我想要的是当我在我的视图控制器中时Hibernate会话仍然打开,并且在视图被提供之前不关闭会话。我该怎么办才能保持开放状态?
我的视图bean看起来像这样,有没有什么方法可以将我的TransactionProxyFactoryBean派生的bean注入其中?
<bean name="/" class="example.SimpleViewController">
<property name="userService" ref="userService"/>
<property name="catalogService" ref="catalogService"/>
</bean>
干杯
的Nik
答案 0 :(得分:1)
请参阅我对此问题的回答:In Spring with jpa/hibernate, how do I keep a session open to avoid lazy initialization exceptions?
我在没有Spring的情况下使用Hibernate,所以我不是100%确定Spring必须处理Sessions的功能,但我相信它有内置的Filter和Interceptor。处理JPA之外的会话的最佳方法是编写一个过滤器,在切换到服务器端的其他内容之前打开会话,然后关闭会话。我相信这就是Spring内置的东西。
答案 1 :(得分:0)
无论您是否使用Spring,您仍然必须使用open-session-in-view模式来避免此特定问题;虽然Spring有一些工具可以帮助在Struts或普通JSP等框架上实现设计模式。