【问题标题】:Spring MVC return hibernate object with lazy loaded field to AjaxResponseBuilderSpring MVC 将带有延迟加载字段的休眠对象返回给 AjaxResponseBuilder
【发布时间】:2014-09-23 21:12:20
【问题描述】:

假设我有一个 Person 对象:

 String name = "bob";
 Int number = 3;
 String lastName = ? 

并且 lastName 字段是用 Hibernate 延迟加载的。当我想

 AjaxResponseBuilder builder = AjaxResponseBuilder.success();
 builder.addData("person", Person");

我收到 HibernateLazyLoad 异常,因为尚未获取 lastName。有没有办法可以在没有这个例外的情况下传递对象的其余部分?到目前为止,我可以将 lastName 设置为 null 并很好地传递对象,但这似乎是一种解决方法而不是解决方案。

【问题讨论】:

  • 什么是 AjaxResponseBuilder ?
  • @bhantol 它是一个 Spring 的东西,用于在 Java 中构建对 Ajax 请求的响应
  • 会话已经关闭。您可能需要配置 OpenSessionInViewFilter 以保持会话为当前线程打开。
  • @Bart 如果我不需要lazyloaded 属性怎么办?我只想在没有惰性字段的情况下通过它?

标签: javascript ajax hibernate spring-mvc lazy-loading


【解决方案1】:

似乎 AjaxResponseBuilder 想要访问 Person 对象的 lastName 字段(可能它只是遍历所有字段)。您有以下选择:

  1. 不要使字段惰性:将lazy="false"添加到.hbm(或相应的注解)

  2. 在将 person 对象传递给构建器之前初始化它的字段:

    Hibernate.initialize(person);
    
  3. 在您的 web.xml 中添加 OpenSessionInViewFilter(如上所述):

    <filter>
      <filter-name>openSessionInViewFilter</filter-name>
      <filter-class>org.springframework.orm.hibernate4.support.OpenSessionInViewFilter</filter-class>
    </filter>
    
    <filter-mapping>
      <filter-name>openSessionInViewFilter</filter-name>
      <url-pattern>/*</url-pattern>
    </filter-mapping>
    

如果 AjaxResponseBuilder 有某种配置告诉它从其查找中省略 lastName 字段,那也应该有效。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-06-15
    • 1970-01-01
    • 1970-01-01
    • 2014-08-08
    • 1970-01-01
    • 2023-03-20
    相关资源
    最近更新 更多