2017-10-18 8 views
9

J'ai un projet d'entreprise configuré par le printemps mvc4 + hibernate5 que toutes ses relations sont désireuses et ses performances sont très mauvaises ... Donc je transforme toutes les relations désireuses à l'étape paresseux par step ... Mais je vois beaucoup d'erreurs dans chaque étape ... et cela fonctionne parfois correctement et parfois non ....spring mvc 4 + hibernate 5 configuration de chargement paresseux

Dans cet exemple HeaderFromStore est une instnace de RequestHeaders et un enfant de RequestLine. DeliveryPoint est l'enfant de requestHeader et je ne veux pas aller chercher deliveryPoint de requestHeader ... Mais si vous ne l'utilisez pas dans une requête select, il ne pourrait pas récupérer HeaderFromStore !!

J'ai utilisé cette requête et j'ai une erreur!

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

Si j'utilise cette requête, je ne reçois pas d'erreur

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; 
     } 


    } 

exception:

Aucun sérialiseur trouvé pour la classe org.hibernate.proxy.pojo.javassist.JavassistLazyInitializer et pas propriétés découvertes pour créer BeanSerializer (pour éviter exception, SerializationFeature.FAIL_ON_EMPTY_BEANS désactiver)) (par référence chaîne : domaine .RequestLine [" " HeaderFromStore] - [> .domain.RequestHeaders " " DeliveryPoint] - > domain.DeliveryPoint _ $$ _ jvst393_f [" " gestionnaire])

avis que je JsonIgnore et JsonInclude (sur les champs et la classe), mais aucun d'entre eux ne fonctionne pas ...

Edit: j'ai finalement trouvé cette solution pour éviter exception et sans tenir compte des propriétés non désirées. Je ajouté cette partie de code à WebMvcConfig extends WebMvcConfigurerAdapter classe:

{ 
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); 
} 

Mais j'ai un autre problème maintenant ... toutes les demandes de poste recevront des propriétés null dans le corps de la demande .... par exemple dans ce code toutes les propriétés de "requestHeaders" en entrée est nul ou vide!

+1

pouvez-vous montrer votre bib hibernate 5 dans la classe mvc config? – Generic

+0

@Generic J'ai résolu le problème précédent et maintenant j'ai un autre problème ... J'ai édité mon post ... et j'ai ajouté des parties de la classe mvc config ... Si tout autre code besoin de répondre faites le moi savoir ...Merci :) – faraa

+1

Je pense qu'il est préférable d'enlever une partie inutile de votre question que vous avez résolue. Si votre travail de chargement paresseux supprime cette partie. – Generic

Répondre

0

Vous devez ajouter chaque entité qui a cette relation en relation avec la définition de la classe.

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

détails sont expliqués here et here

J'espère que ces résout votre problème.