【问题标题】:Database-sessions in SpringSpring 中的数据库会话
【发布时间】:2010-11-22 13:00:07
【问题描述】:

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

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

我不希望我的服务急切地获取数据,这会消耗大量 RAM,因为我的图表很深,甚至可以有循环引用。我也不想明确涉及我将在服务中显示的部分,因为这意味着我必须一遍又一遍地复制/粘贴编写类似的服务。所以我想要的是当我在我的视图控制器中时让 Hibernate 会话仍然打开,并且在视图被提供之前不要关闭会话。我该怎么做才能让它保持打开状态?

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

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

干杯

尼克

【问题讨论】:

    标签: hibernate spring session transactions spring-mvc


    【解决方案1】:

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

    我在没有 Spring 的情况下使用 Hibernate,所以我不能 100% 确定 Spring 处理 Sessions 的能力,但我相信它有内置的过滤器和拦截器。在 JPA 之外处理会话的最佳方法是编写一个过滤器,在将会话交给服务器端的其余部分之前打开会话,然后再关闭会话。我相信这就是 Spring 内置的东西。

    【讨论】:

    • 非常常见的问题。在过滤器中打开会话是要走的路。
    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-01-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-11-26
      • 2011-01-05
      • 1970-01-01
      相关资源
      最近更新 更多