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!
pouvez-vous montrer votre bib hibernate 5 dans la classe mvc config? – Generic
@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
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