欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Hibernate5关于Lazy Json转换错误

程序员文章站 2022-04-13 13:06:47
...

@ResponseBody返回Object对象, 该对象将会被ObjectMapper转化为json

如果框架里面使用了hibernate,  而且查询出来的对象有延迟加载的属性

ObjectMapper把对象转化成json 的时候, 会读取lazy property, 这样会触发Lazy获得延迟加载的数据,这并不是我们想要的结果。

@jsonignore 注解掉是可以,但是如果我门哪天突然想获取了,就根本不可能。那么怎么办呢。

Hibernate其实有过这样的Jar包。Maven上可以找到

<dependency>
    <groupId>com.fasterxml.jackson.datatype</groupId>
    <artifactId>jackson-datatype-hibernate5</artifactId>
    <version>2.9.4</version>
</dependency>
加上这个包之后
package com.kd.core.utils;

import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.SerializationFeature;
import com.fasterxml.jackson.datatype.hibernate5.Hibernate5Module;
import com.fasterxml.jackson.datatype.hibernate5.Hibernate5Module.Feature;
public class HibernateAwareObjectMapper extends ObjectMapper{

    /**
    * @Fields serialVersionUID : TODO(用一句话描述这个变量表示什么)
    */ 
     private static final long serialVersionUID = 7958167810745447350L;  
        public HibernateAwareObjectMapper() {  
            Hibernate5Module hm = new Hibernate5Module(); 
            hm.configure(Feature.USE_TRANSIENT_ANNOTATION, false);
            registerModule(hm);
           
        }  
        public void setPrettyPrint(boolean prettyPrint) {  
            configure(SerializationFeature.INDENT_OUTPUT, prettyPrint);
        }  
}



现在进行说明 其实这个包吧@Transient给默认排除了。只对ORM关系进行处理 也就是你加上 @Transient就不给你转。网上这样的说明很少。懒得看源码的

hm.configure(Feature.USE_TRANSIENT_ANNOTATION, false);

这句话才是重点,必须要写false 让他转换

然后编写springmvc.xml 在<mvc:message-converters ></mvc:message-converters>中加入或者改变成以下配置

<bean class="org.springframework.http.converter.json.MappingJackson2HttpMessageConverter">
     <property name="objectMapper">
          <bean class="com.kd.core.utils.HibernateAwareObjectMapper">
          <property name="prettyPrint" value="true"/>
           </bean>
      </property>
 </bean>	
至此,你的问题就解决了。其实Lazy可以善用,用的好性能提升,用的不好适得其反。