Spring中的数据库会话

时间:2009-08-25 08:11:33

标签: hibernate spring session transactions spring-mvc

我对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

2 个答案:

答案 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等框架上实现设计模式。