spring mvc 4 + hibernate 5延迟加载配置
我有一个由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);
}
你可以在mvc config类中显示你的hibernate 5 bean吗? – Generic
@Generic我解决了以前的问题,现在我有另一个问题...我编辑我的帖子...并添加了mvc配置类的部分...如果任何其他代码需要回答让我知道...谢谢:) – faraa
我认为它更好地移除你解决的问题中不必要的部分。如果你的懒加载工作删除该部分。 – Generic