【问题标题】:spring mvc 4 + hibernate 5 lazy loading configurationspring mvc 4 + hibernate 5 懒加载配置
【发布时间】:2017-10-18 09:09:59
【问题描述】:

我有一个由spring mvc4 + hibernate5配置的企业项目,它的所有关系都是渴望的,而且性能很差……所以我正在逐步将所有渴望的关系转变为惰性……但是我看到很多错误在每一步中......它有时正常工作,有时不正常......

在此示例中,HeaderFromStore 是 RequestHeaders 的实例和 RequestLine 的子代。 DeliveryPoint 是 requestHeader 的子节点,我不想获取 requestHeader 的 deliveryPoint ...但是如果不在选择查询中使用它,则无法获取 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 并且没有 发现创建 BeanSerializer 的属性(为了避免异常, 禁用 SerializationFeature.FAIL_ON_EMPTY_BEANS) )(通过参考 链: domain.RequestLine["HeaderFromStore"]->.domain.RequestHeaders["DeliveryPoint"]->domain.DeliveryPoint_$$_jvst393_f["handler"])

请注意,我使用了 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 请求都将在请求正文中收到 null 属性...例如在此代码中,输入中“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);

    }

【问题讨论】:

  • 你能在 mvc 配置类中显示你的 hibernate 5 bean 吗?
  • @Generic 我解决了以前的问题,现在我遇到了另一个问题...我编辑了我的帖子...我添加了部分 mvc 配置类...如果任何其他代码需要回答让我知道...谢谢:)
  • 我认为最好删除您解决的问题中不必要的部分。如果您的延迟加载工作删除了该部分。
  • 这可能不是答案,但我建议不要使用实体对象作为数据传输对象。这将使您的应用程序更易于维护和扩展。像您这样的问题通常是由两者混合造成的。
  • @faraa - 表示您说 RequestBody 注释不起作用。它没有在 RequestHeaders requestHeaders 中设置属性值

标签: java spring hibernate spring-mvc lazy-loading


【解决方案1】:

您应该在类定义的顶部添加与此注释相关的每个实体。

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

详细说明herehere

我希望这些可以解决您的问题。

【讨论】:

    猜你喜欢
    • 2016-02-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-07-14
    • 1970-01-01
    • 2017-06-28
    • 2012-04-13
    • 1970-01-01
    相关资源
    最近更新 更多