2017-10-18 192 views
9

我有一个由spring mvc4 + hibernate5配置的企业项目,它的所有关系都渴望而且它的性能非常差......所以我正在将所有渴望的关系转化为懒惰的一步step ...但是我在每个步骤中看到很多错误...并且它有时可以正常工作,有时不正常。spring mvc 4 + hibernate 5延迟加载配置

在此示例中,HeaderFromStore是RequestHeaders的一个Instnace和RequestLine的一个子节点。 DeliveryPoint是requestHeader的子项,我不想获取requestPoint的deliveryPoint ...但是如果不在select查询中使用它,它将无法获取HeaderFromStore!

我用这个查询,我得到错误!

select m from MAMRequestLines m join fetch m.mamRequestHeaders r 
left join fetch m.requestHeaderFromStore rr where m.id =:id 

如果我用这个查询我没有得到错误

select m from MAMRequestLines m join fetch m.mamRequestHeaders r 
left join fetch m.requestHeaderFromStore rr 
join fetch rr.mamDeliveryPoints 
left join fetch r.mamDeliveryPoints 
join fetch where m.id =:id 

RequestLine.java

@Entity(name = "RequestLines") 
@Table(name = "_REQUEST_LINES") 
//@JsonIdentityInfo(generator=ObjectIdGenerators.PropertyGenerator.class, property = "@id") 
public class RequestLines extends Entity implements Serializable { 

    @JsonInclude(JsonInclude.Include.NON_EMPTY) 
    private RequestHeaders requestHeaders; 

    @JsonInclude(JsonInclude.Include.NON_EMPTY) 
    private RequestHeaders requestHeaderFromStore; 

    @Id 
    @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "_REQUEST_Line_SEQ") 
    @SequenceGenerator(name = "_REQUEST_Line_SEQ", sequenceName = "_REQUEST_Line_SEQ") 
    @Column(name = "REQUEST_LINE_ID") 
    public Long getId() { 
     return id; 
    } 

    public void setId(Long id) { 
     this.id = id; 
    } 

    @ManyToOne(fetch = FetchType.LAZY) 
    @JoinColumn(name = "REQUEST_HEADER_ID", nullable = false) 
    public RequestHeaders getRequestHeaders() { 
     return RequestHeaders; 
    } 

    public void setRequestHeaders(RequestHeaders requestHeaders) { 
     this.RequestHeaders = requestHeaders; 
    } 

    @ManyToOne(fetch = FetchType.LAZY) 
    @JoinColumn(name = "REQUEST_HEADER_FROM_STORE") 
    public RequestHeaders getRequestHeaderFromStore() { 
     return requestHeaderFromStore; 
    } 

    public void setRequestHeaderFromStore(RequestHeaders requestHeaderFromStore) { 
     this.requestHeaderFromStore = requestHeaderFromStore; 
    } 

} 

RequestHeader.java

@Entity(name = "RequestHeaders") 
    @Table(name = "REQUEST_HEADERS") 
    //@JsonInclude(JsonInclude.Include.NON_EMPTY) 
    public class RequestHeaders extends Entity implements Serializable { 

     private long id; 



    // @JsonInclude(JsonInclude.Include.NON_EMPTY) 
     // @JsonIgnore 
     private DeliveryPoints DeliveryPoints; 


     @JsonIgnore 
     private Set<RequestLines> RequestLinesSet; 


     @Id 
     @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "_REQUEST_HEADERS_SEQ") 
     @SequenceGenerator(name = "_REQUEST_HEADERS_SEQ", sequenceName = "_REQUEST_HEADERS_SEQ") 
     @Column(name = "REQUEST_HEADER_ID") 
     public long getId() { 
      return id; 
     } 

     public void setId(long id) { 
      this.id = id; 
     } 



     @ManyToOne(fetch = FetchType.LAZY) 
     @JoinColumn(name = "DELIVERY_POINT_ID", nullable = false) 
     public DeliveryPoints getDeliveryPoints() { 
      return DeliveryPoints; 
     } 

     public void setDeliveryPoints(DeliveryPoints DeliveryPoints) { 
      this.DeliveryPoints = DeliveryPoints; 
     } 


     @OneToMany(mappedBy = "RequestHeaders", fetch = FetchType.LAZY, cascade = CascadeType.ALL, orphanRemoval = true) 
     @OnDelete(action = OnDeleteAction.CASCADE) 
     public Set<RequestLines> getRequestLinesSet() { 
      return RequestLinesSet; 
     } 

     public void setRequestLinesSet(Set<RequestLines> RequestLinesSet) { 
      this.RequestLinesSet = RequestLinesSet; 
     } 


    } 

例外:

没有串行找到类 org.hibernate.proxy.pojo.javassist.JavassistLazyInitializer和没有 性质发现(以避免异常, 禁用SerializationFeature.FAIL_ON_EMPTY_BEANS))(通过参考 链来创建BeanSerializer: 域.RequestLine [" HeaderFromStore "] - > .domain.RequestHeaders [" DeliveryPoint "] - > domain.DeliveryPoint _ _ $$ jvst393_f ["处理机"])

注意,我使用JsonIgnore和JsonInclude(字段和类),但没有人不工作...

编辑: 我终于找到了这个解决方案,以避免异常,并忽略不需要的属性。 我添加的代码,这部分WebMvcConfig extends WebMvcConfigurerAdapter类:

{ 
public MappingJackson2HttpMessageConverter jacksonMessageConverter(){ 
    MappingJackson2HttpMessageConverter messageConverter = new MappingJackson2HttpMessageConverter(); 

    ObjectMapper mapper = new ObjectMapper(); 
    //Registering Hibernate4Module to support lazy objects 
    mapper.registerModule(new Hibernate4Module()); 

    messageConverter.setObjectMapper(mapper); 
    return messageConverter; 

} 

@Override 
public void configureMessageConverters(List<HttpMessageConverter<?>> converters) { 
    //Here we add our custom-configured HttpMessageConverter 
    converters.add(jacksonMessageConverter()); 
    super.configureMessageConverters(converters); 
} 

但我有一个问题,现在...所有的post请求将收到的请求主体空属性....例如在这段代码的所有属性输入中的“requestHeaders”为空或为空!

@RequestMapping(value = "/requestHeader/", method = RequestMethod.POST, consumes = {"application/json"}) 
    public ResponseEntity<Void> createRequestHeaders(@RequestBody RequestHeaders requestHeaders, UriComponentsBuilder ucBuilder) { 

     requestHeaders.setDeliveryPoints(deliveryPointsService.find(requestHeaders.getDeliveryPointsId())); 

     requestHeadersService.add(requestHeaders); 
     HttpHeaders headers = new HttpHeaders(); 

     return new ResponseEntity<Void>(headers, HttpStatus.CREATED); 

    } 
+1

你可以在mvc config类中显示你的hibernate 5 bean吗? – Generic

+0

@Generic我解决了以前的问题,现在我有另一个问题...我编辑我的帖子...并添加了mvc配置类的部分...如果任何其他代码需要回答让我知道...谢谢:) – faraa

+1

我认为它更好地移除你解决的问题中不必要的部分。如果你的懒加载工作删除该部分。 – Generic

回答

0

您应该在类定义的顶部添加与此注释有关的每个实体。

@JsonIgnoreProperties({"hibernateLazyInitializer", "handler"}) 

详细解释herehere

我希望这些解决您的问题。