2017-10-18 12 views
9

私は春のmvc4 + hibernate5によって構成されたエンタープライズプロジェクトを持っています。その関係はすべて熱心であり、パフォーマンスは非常に悪い...だから私はすべての熱心な関係を怠惰なステップに変えています。ステップ...しかし、私は各ステップで多くのエラーを参照しています...そして、時には正しく動作しない場合もあります。spring mvc 4 + hibernate 5遅延ロード設定

この例では、HeaderFromStoreはRequestHeadersとRequestLineの子です。 DeliveryPointはrequestHeaderの子であり、requestHeaderの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); 
} 

しかし、私は今、別の問題を抱えている...すべてのポスト要求は、このコードでは、たとえば....リクエストボディでヌルのプロパティでのすべてのプロパティを受け取ることになります入力の「requestHeaders」がnullまたは空です。

@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 configクラスの一部を追加しました。ありがとうございました:) – faraa

+1

私はあなたが解決したあなたの質問の不要な部分を削除する方が良いと思います。あなたの怠惰な読み込み作業がその部分を削除する場合。 – Generic

答えて

0

このアノテーションを持つエンティティをクラス定義の先頭に追加する必要があります。

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

詳細は、私はこれらがあなたの問題を解決を願っていherehere

を説明しています。

関連する問題