LazyInitializationException весной (не часто выдается) - PullRequest
0 голосов
/ 22 апреля 2020

Исключение org.hibernate.LazyInitializationException выбрасывается в приложение, и моя задача не может его воспроизвести.

Сущность: OrderDetail. java имеет

/** The order discounts. */
@OneToMany(mappedBy = "orderDetail", fetch = FetchType.LAZY, orphanRemoval = true, cascade = CascadeType.ALL)
private Set<OrderDiscount> orderDiscounts = new HashSet<>();

public Set<OrderDiscount> getOrderDiscounts() {
    return orderDiscounts;
}

public void setOrderDiscounts(Set<OrderDiscount> orderDiscounts) {
    this.orderDiscounts = orderDiscounts;
}

ReadOnlyOrderDetail. java, я инициализирую конструктор, как показано ниже

public ReadOnlyOrderDetail(OrderDetail orderDetail, boolean isDiscountsRequired) {
    //setting other properties

    if (isDiscountsRequired) {
        Optional.ofNullable(orderDetail.getOrderDiscounts()).ifPresent(orderDiscounts -> {
            orderDiscounts.forEach(discounts -> {
                // sets discount
            });
        });
    }
}

Укажите на примечание , вот что orderDetail.getOrderDiscounts () отключается как пустой Set и код внутри If {} не выполняется, это то, что я видел до сих пор. Но все же, что меня смущает, так это в журнале: java.base/java.lang.Iterable.forEach(Iterable.java:74)

Теперь OrderDetail - это класс Entity. OrderDetail сопоставляется с ReadOnlyOrderDetail - классом модели, который используется для генерации ответа Json, который должен быть возвращен.

Исключение возникает, когда объект ReadOnlyOrderDetail инициализируется в конструкторе. Чтобы быть точным c, бывает @ orderDetail.getOrderDiscounts () - это то, что я понимаю. Это не является последовательным поведением, но имеет отношение к сеансу, я думаю

Любые мысли по этому поводу приветствуются.

Публикация исключения, созданного для вашей справки:

com.pip.api.common.exceptions.HEBException: org.hibernate.LazyInitializationException: failed to lazily initialize a collection of role: com.pip.os.api.entity.OrderDetail.orderDiscounts, could not initialize proxy - no Session
at com.pip.os.api.controller.OrderController.addToCart(OrderController.java:199)
at com.pip.os.api.controller.OrderController$$FastClassBySpringCGLIB$$843b359d.invoke(<generated>)
at org.springframework.cglib.proxy.MethodProxy.invoke(MethodProxy.java:218)
at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.invokeJoinpoint(CglibAopProxy.java:749)
at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:163)
at org.springframework.aop.framework.adapter.AfterReturningAdviceInterceptor.invoke(AfterReturningAdviceInterceptor.java:55)
at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:186)
at org.springframework.aop.framework.adapter.MethodBeforeAdviceInterceptor.invoke(MethodBeforeAdviceInterceptor.java:56)
at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:186)
at org.springframework.aop.framework.adapter.AfterReturningAdviceInterceptor.invoke(AfterReturningAdviceInterceptor.java:55)
at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:186)
at org.springframework.aop.framework.adapter.MethodBeforeAdviceInterceptor.invoke(MethodBeforeAdviceInterceptor.java:56)
at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:186)
at org.springframework.aop.framework.adapter.MethodBeforeAdviceInterceptor.invoke(MethodBeforeAdviceInterceptor.java:56)
at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:186)
at org.springframework.aop.framework.adapter.MethodBeforeAdviceInterceptor.invoke(MethodBeforeAdviceInterceptor.java:56)
at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:186)
at org.springframework.aop.interceptor.ExposeInvocationInterceptor.invoke(ExposeInvocationInterceptor.java:93)
at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:186)
at org.springframework.aop.framework.CglibAopProxy$DynamicAdvisedInterceptor.intercept(CglibAopProxy.java:688)
at com.pip.os.api.controller.OrderController$$EnhancerBySpringCGLIB$$951ef945.addToCart(<generated>)
at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.base/java.lang.reflect.Method.invoke(Method.java:566)
at org.springframework.web.method.support.InvocableHandlerMethod.doInvoke(InvocableHandlerMethod.java:189)
at org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:138)
at org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:102)
at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandlerMethod(RequestMappingHandlerAdapter.java:895)
at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:800)
at org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:87)
at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:1038)
at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:942)
at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:1005)
at org.springframework.web.servlet.FrameworkServlet.doPost(FrameworkServlet.java:908)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:660)
at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:882)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:741)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:231)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:53)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
at org.apache.catalina.filters.CorsFilter.handleNonCORS(CorsFilter.java:352)
at org.apache.catalina.filters.CorsFilter.doFilter(CorsFilter.java:171)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:199)
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:96)
at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:607)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:139)
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:92)
at org.apache.catalina.valves.AbstractAccessLogValve.invoke(AbstractAccessLogValve.java:668)
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:74)
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:343)
at org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:408)
at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:66)
at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:770)
at org.apache.tomcat.util.net.Nio2Endpoint$SocketProcessor.doRun(Nio2Endpoint.java:1664)
at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:49)
at org.apache.tomcat.util.net.AbstractEndpoint.processSocket(AbstractEndpoint.java:1008)
at org.apache.tomcat.util.net.Nio2Endpoint$Nio2SocketWrapper$4.completed(Nio2Endpoint.java:545)
at org.apache.tomcat.util.net.Nio2Endpoint$Nio2SocketWrapper$4.completed(Nio2Endpoint.java:523)
at org.apache.tomcat.util.net.SecureNio2Channel$1.completed(SecureNio2Channel.java:960)
at org.apache.tomcat.util.net.SecureNio2Channel$1.completed(SecureNio2Channel.java:889)
at java.base/sun.nio.ch.Invoker.invokeUnchecked(Invoker.java:127)
at java.base/sun.nio.ch.Invoker$2.run(Invoker.java:219)
at java.base/sun.nio.ch.AsynchronousChannelGroupImpl$1.run(AsynchronousChannelGroupImpl.java:112)
at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1128)
at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:628)
at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)
at java.base/java.lang.Thread.run(Thread.java:834)
Caused by: org.hibernate.LazyInitializationException: failed to lazily initialize a collection of role: com.pip.os.api.entity.OrderDetail.orderDiscounts, could not initialize proxy - no Session
at org.hibernate.collection.internal.AbstractPersistentCollection.throwLazyInitializationException(AbstractPersistentCollection.java:579)
at org.hibernate.collection.internal.AbstractPersistentCollection.withTemporarySessionIfNeeded(AbstractPersistentCollection.java:203)
at org.hibernate.collection.internal.AbstractPersistentCollection.initialize(AbstractPersistentCollection.java:558)
at org.hibernate.collection.internal.AbstractPersistentCollection.read(AbstractPersistentCollection.java:131)
at org.hibernate.collection.internal.PersistentSet.iterator(PersistentSet.java:163)
at java.base/java.lang.Iterable.forEach(Iterable.java:74)
at com.pip.os.api.entity.ReadOnlyOrderDetail.lambda$new$1(ReadOnlyOrderDetail.java:211)
at java.base/java.util.Optional.ifPresent(Optional.java:183)
at com.pip.os.api.entity.ReadOnlyOrderDetail.<init>(ReadOnlyOrderDetail.java:210)
at com.pip.os.api.entity.Order.lambda$getNonVoidedOrderDetails$7(Order.java:475)
at java.base/java.lang.Iterable.forEach(Iterable.java:75)
at com.pip.os.api.entity.Order.getNonVoidedOrderDetails(Order.java:474)
at com.pip.os.api.services.OrderService.addItemToCart(OrderService.java:513)
at com.pip.os.api.services.OrderService$$FastClassBySpringCGLIB$$576fe592.invoke(<generated>)
at org.springframework.cglib.proxy.MethodProxy.invoke(MethodProxy.java:218)
at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.invokeJoinpoint(CglibAopProxy.java:749)
at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:163)
at org.springframework.transaction.interceptor.TransactionAspectSupport.invokeWithinTransaction(TransactionAspectSupport.java:294)
at org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:98)
at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:186)
at org.springframework.aop.framework.adapter.AfterReturningAdviceInterceptor.invoke(AfterReturningAdviceInterceptor.java:55)
at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:186)
at org.springframework.aop.framework.adapter.MethodBeforeAdviceInterceptor.invoke(MethodBeforeAdviceInterceptor.java:56)
at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:186)
at org.springframework.aop.interceptor.ExposeInvocationInterceptor.invoke(ExposeInvocationInterceptor.java:93)
at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:186)
at org.springframework.aop.framework.CglibAopProxy$DynamicAdvisedInterceptor.intercept(CglibAopProxy.java:688)
at com.pip.os.api.services.OrderService$$EnhancerBySpringCGLIB$$9e9ad550.addItemToCart(<generated>)
at com.pip.os.api.controller.OrderController.addToCart(OrderController.java:185)
... 71 more

ОБНОВЛЕНИЕ: метод КОНТРОЛЛЕРА

public ResponseEntity<AddToCartResponse> addToCart(@RequestBody AddToCartRequest addToCartRequest)
        throws PIPAccessException, PIPSecurityException, PIPException {

    try {
        AddToCartResponse addToCartResponse = new AddToCartResponse();

        addToCartResponse = orderService.addItemToCart(addToCartRequest);

        return ResponseEntity.ok(addToCartResponse);
    } catch (Exception e) {
        throw new PIPException(e, ResponseCode.FAILURE.getResponseCode());
    }
}
...