Jackson尝试序列化延迟加载的对象并抛出“org.hibernate.LazyInitializationException - 无法懒惰地初始化......”

时间:2014-05-02 12:04:46

标签: hibernate spring-mvc serialization jackson jackson-modules

我的环境

  • jackson-datatype-hibernate 2.3.2
  • Spring-webmvc 3.2.6
  • Hibernate 4.3.4

所以基本上我的应用程序应该返回一系列序列化公司。 公司类有一组延迟加载的旅行者对象(lazy =' true'在映射中定义)。因此,它们不应该被序列化。 但是,当杰克逊从控制器序列化公司时,出于某种原因,它还会尝试序列化旅行者,但它会崩溃并抛出错误: org.hibernate.LazyInitializationException - 懒得失败 初始化角色集合:com.model.core.Corporation.employees

我已经搜索了这个问题,我已经在几个帖子中看到了它,但到目前为止我还没有能够修复它。 https://github.com/FasterXML/jackson-datatype-hibernate/issues/25

我的代码基本上由java" Corporation"具有hbm.xml映射的类。 我还扩展了ObjectMapper并将其设置为Spring消息转换器,如中所述 该帖子(Avoid Jackson serialization on non fetched lazy objects) 然后我创建了一个" CorporationMixin" class并使用@JsonIdentityInfo注释它。 为了完成,我只是从控制器返回公司列表。

请查看我的代码并给我一个提示。 我不知道问题是我的实现还是jackson-datatype-hibernate库中的错误。

映射hbm:

<class name="com.model.core.Corporation" table="corporation" lazy="false">
 <id name="id" column="corporation_id" type="java.lang.String" unsaved-value="0">
    <generator class="guid"/>
  </id>
 <set lazy="true" name="employees" inverse="false" cascade="delete">
   <key column="corporation_id"/>
   <one-to-many class="com.model.core.Employee"/>
 </set>
...
</class>

&#34;株式会社&#34;实体:

public class Corporation implements Serializable
{
 private String id;
 private Set<Employee> employees;
...(get/set)
}

Mapper添加到servlet-context.xml:

<mvc:annotation-driven >
        <mvc:message-converters>
            <!-- Use the HibernateAware mapper instead of the default -->
            <bean id="jacksonMessageConverter" class="org.springframework.http.converter.json.MappingJackson2HttpMessageConverter">
                <property name="objectMapper">
                    <bean class="com.mapper.HibernateAwareObjectMapper" />
                </property>
            </bean>
        </mvc:message-converters>
    </mvc:annotation-driven>

HibernateAwareObjectMapper类:

public class HibernateAwareObjectMapper extends ObjectMapper {

    public HibernateAwareObjectMapper() {
        registerModule(new Hibernate4Module());
        this.addMixInAnnotations(Corporation.class, CorporationMixin.class);
    }
}

CorporationMixin类:

@JsonIdentityInfo(generator=ObjectIdGenerators.PropertyGenerator.class, property="id")
public abstract class CorporationMixin {
}

返回序列化公司的Controller类:

@RequestMapping(value="/secured/corporations/init",method = RequestMethod.GET,produces = "application/json") 
    @ResponseBody 
    public ResponseEntity<List<Corporation>> getUsersList()
    {
        List<Corporation> corps = corporationDao.getTopCorporations();
        return new ResponseEntity<List<Corporation>>(corps, HttpStatus.OK);
    }

有一种解决方法可以避免hibernate崩溃,这基本上是在web.xml中添加它

<filter>
    <filter-name>hibernateFilter</filter-name>
    <filter-class>org.springframework.orm.hibernate3.support.OpenSessionInViewFilter</filter-class>
    <init-param>
      <param-name>singleSession</param-name>
      <param-value>false</param-value>
    </init-param>
  </filter>
  <filter-mapping>
    <filter-name>hibernateFilter</filter-name>
    <url-pattern>/*</url-pattern>
  </filter-mapping>

但这并没有真正解决最初的问题,这就是为什么杰克逊试图序列化其lazy = true的集合

感谢您的帮助!

0 个答案:

没有答案