2009-08-25 51 views
1

我对Spring很新,我想了解更多有关会话的内容。我已经使用Hibernate注释过的实体映射了遗留数据库,并构建了一些服务对象来提取,检索等。我的实体还包含其他实体(通过外键映射)和实体集。当我在我的服务中遍历entitiy图时,我没有问题。我的服务被包装在一个TransactionProxyFactoryBean中,所以一切都应该很好。Spring中的数据库会话

因此,在我的视图控制器中,我从服务请求了一堆实体。但是当我遍历我的视图控制器中的实体图形(例如显示用户状态的国家名称,州和国家都是懒惰加载的实体)时,Hibernate会话已经关闭,我得到一个“LazyInitializationException:无法初始化代理 - 没有会话“

我不希望我的服务急于获取数据,这将消耗多少内存,因为我的图形很深,甚至可以有循环引用。我也不想明确地触及我将在服务中显示的部分,因为这意味着我必须一遍又一遍地复制/粘贴类似的服务。所以我想要的是当我在视图控制器中时,Hibernate会话仍然打开,并且在视图被提供之前不关闭会话。我可以做些什么来保持它的开放?

我的视图bean看起来像这样,有没有什么办法可以将我的TransactionProxyFactoryBean派生的bean注入它?

<bean name="/" class="example.SimpleViewController"> 
    <property name="userService" ref="userService"/> 
    <property name="catalogService" ref="catalogService"/> 
    </bean> 

干杯

回答

1

见我回答这个问题:In Spring with jpa/hibernate, how do I keep a session open to avoid lazy initialization exceptions?

我使用Hibernate使用Spring,所以我不是100%肯定的能力春有处理会话,但我相信它有一个内置的过滤器和拦截器。处理JPA之外的会话的最佳方式是编写一个过滤器,在将它切换到服务器端其余部分之前打开会话,然后关闭会话。我相信这是Spring内置的东西。

+0

非常常见的问题。在过滤器中打开会话是要走的路。 – 2009-08-25 20:01:33

0

不管你是否使用Spring,你仍然必须使用open-session-in-view模式来避免这个特殊问题。尽管Spring有一些工具可以帮助在Struts或普通JSP等框架上实现设计模式。