2017-10-18 194 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

我希望這些解決您的問題。