2017-09-13 180 views
2

我试图发展与休眠春天REST API。 在谷歌搜索后,我还没有找到解决延迟加载。 我有两个实体,如下图所示:弹簧安置延迟加载和Hibernate

University.java

@Entity() 
@Table(schema = "core", name = "university") 
public class University extends BaseEntity { 

    private String uniName; 
    private String uniTelephon; 


    @LazyCollection(LazyCollectionOption.FALSE) 
    @OneToMany(fetch = FetchType.LAZY, mappedBy = "university", cascade = CascadeType.ALL) 
    @JsonManagedReference 
    private List<Student> students; 

//setter and getter 
} 

Student.java

@Entity 
@Table(schema = "core",name = "student") 
public class Student { 

    @Id 
    @GeneratedValue    
    private long id;   

    private String firstName;   

    private String lastName;   

    private String section; 

    @ManyToOne(fetch=FetchType.LAZY) 
    @JoinColumn(name = "UNIVERSITY_ID",nullable = false) 
    @JsonBackReference 
    private University university; 
    // setter and getter 
} 

任我休息终点

@GetMapping("/list") 
public ResponseEntity list() throws Exception { 
    // I need to return just Universities But it return it eagerly with their students 
    return new ResponseEntity(this.universityService.findAll(), HttpStatus.OK); 
} 

调用REST API后,它与所有学生一起返回大学。

有一种方式来告诉杰克逊不序列化未提取对象或集合?

有人可以帮助我已验证解决方案?

回答

3

尝试添加以下扶养(取决于你的Hibernate版本):

<dependency> 
    <groupId>com.fasterxml.jackson.datatype</groupId> 
    <artifactId>jackson-datatype-hibernate5</artifactId> 
    <version>${jackson.version}</version> 
</dependency> 

然后(假设你有一个基于Java的配置)中添加以下的WebMvcConfigurerAdapter类:

@Override 
public void configureMessageConverters(List<HttpMessageConverter<?>> converters) { 
    converters.add(jackson2HttpMessageConverter()); 
} 

@Bean 
public MappingJackson2HttpMessageConverter jackson2HttpMessageConverter() { 
    MappingJackson2HttpMessageConverter converter = new MappingJackson2HttpMessageConverter(); 
    converter.setObjectMapper(this.jacksonBuilder().build()); 

    return converter; 
} 

public Jackson2ObjectMapperBuilder jacksonBuilder() { 
    Jackson2ObjectMapperBuilder builder = new Jackson2ObjectMapperBuilder(); 

    Hibernate5Module hibernateModule = new Hibernate5Module(); 

    hibernateModule.configure(Feature.FORCE_LAZY_LOADING, false); 

    builder.modules(hibernateModule); 

    // Spring MVC default Objectmapper configuration 
    builder.featuresToDisable(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES); 
    builder.featuresToDisable(MapperFeature.DEFAULT_VIEW_INCLUSION); 

    return builder; 
} 

它应该强制Jackson的objectMapper不会获取延迟加载的值。

+0

其通过以下异常HTTP状态500 - 无法写入内容:无法懒惰地初始化角色集合:a2.asena.cashModel.University.students,无法初始化代理 - 无会话(通过引用链:java。 util.ArrayList [0] - > a2.asena.cashModel.University [ “学生”]);嵌套的异常是com.fasterxml.jackson.databind.JsonMappingException:未能懒惰地初始化一个角色集合:a2.asena.cashModel.University.students,无法初始化代理 - 没有会话(通过引用链:java.util.ArrayList [ 0] - > a2.asena.cashModel.University [“students”]) – Generic

+0

for above exception solution is overriding Filter in Appinitializer @Override protected Filter [] getServletFilters(){ return new Filter [] {new HiddenHttpMethodFilter(),新MultipartFilter(),新OpenEntityManagerInViewFilter()};是 – Generic

+0

一些文章说这是不正确的解决方案 – Generic