代码之家  ›  专栏  ›  技术社区  ›  Yunus Einsteinium

停止Spring MVC获取Lazyload数据

  •  1
  • Yunus Einsteinium  · 技术社区  · 6 年前

    使用创建了一个简单的Spring引导项目 SpringBoot 1.5.15.BUILD-SNAPSHOT 具有 data-jpa spring-mvc(web) 有两个实体。

    父实体

    @Entity
    public class Parent {
        @Id
        @GeneratedValue(strategy = GenerationType.IDENTITY)
        @Basic(optional = false)
        @Column(name = "id")
        private Integer id;
    
        @Column(name = "name")
        private String name;
    
        @OneToMany(cascade = CascadeType.ALL)
        @JoinColumn(name = "parent_id")
        private Collection<Child> children;
    
        //Getter & Setter remove for brevity
    }
    

    子实体

    @Entity
    public class Child {
        @Id
        @GeneratedValue(strategy = GenerationType.IDENTITY)
        @Basic(optional = false)
        @Column(name = "id")
        private Integer id;
    
        @Column(name = "name")
        private String name;
    }
    

    每当一个端点获取所有 Parent 数据被调用,子数据也被返回,但是,根据我的理解,默认fetchtype是lazyloading。

    以下用于获取数据的Spring MVC REST代码

    @RestController
    @RequestMapping("test")
    public class Controller {
        @Autowired
        ParentRepository parentRepository;
    
        @RequestMapping(produces = MediaType.APPLICATION_JSON_VALUE, method = RequestMethod.GET)
        public ResponseEntity<Collection<Parent>> findAll(HttpServletRequest request) {
            List<Parent> parents = parentRepository.findAll();
            return new ResponseEntity<>(parents, HttpStatus.OK);
        }
    }
    

    我们所期望的和应该发生的只是 起源 当数据是Lazyload时,应该提取数据,而不是使用子数据收集。

    我怎么能阻止这种总是急于装填孩子的不受欢迎的行为呢?

    我试过设置 fetchType 对Lazyload来说,尽管在我调用'/test'时仍然会获取子数据

    1 回复  |  直到 6 年前
        1
  •  0
  •   Yunus Einsteinium    6 年前

    我终于停了下来 Jackson 从友好的拉懒惰加载的数据为我。

    就这么做 添加以下Maven依赖项

      <dependency>
            <groupId>com.fasterxml.jackson.datatype</groupId>
            <artifactId>jackson-datatype-hibernate5</artifactId>
            <version>2.9.6</version>
      </dependency>
    

    then子类 ObjectMapper 像这样,根据您使用的Hibernate版本注册Hibernate模块。我使用的是Hibernate 5,所以我这样做了

    public class HibernateAwareObjectMapper extends ObjectMapper {
    
        public HibernateAwareObjectMapper() {
            registerModule(new Hibernate5Module());
        }
    }
    

    最后添加一个 Bean

    @Bean
    public ObjectMapper objectMapper(){
        return new HibernateAwareObjectMapper();
    }
    

    上面的代码就位后,惰性加载的属性不会自动初始化。