当前位置: 首页 > 知识库问答 >
问题:

Spring boot@Async注释引发LazyInitializationException

景书
2023-03-14
@Service
public class EmailSenderService {
    // working
    @Async
    public void sendNewBidRequestEmail(BidRequest bidRequest) {
        this.sendNewBidRequestEmailToSupplier(bidRequest);
    }
    @Transactional
    public void sendNewBidRequestEmailToSupplier(BidRequest bidRequest) {
        sendNewBidRequestEmailToSupplier(bidRequest, bidRequest.getHotels());
    }

    @Transactional
    public void sendNewBidRequestEmailToSupplier(BidRequest bidRequest, List<Hotel> hotelList) {
        for (Hotel hotel : hotelList) {
           ...
           this.sender.send()
        }
    }


    // not working, throw exception
    @Async
    public void sendCancelledBidRequestEmail(BidRequest bidRequest, String reason) {
        this.sendCancelledBidRequestEmailToSupplier(bidRequest, bidRequest.getHotels(), reason);
    }

    @Transactional
    public void sendCancelledBidRequestEmailToSupplier(BidRequest bidRequest, List<Hotel> hotelList, String reason) {
        for (Hotel hotel : hotelList) {   // throw exception here
           ...
           this.sender.send();
        }
}

我完全遵循这条线索。您可以看到这两种异步方法具有几乎相同的结构。异步方法调用事务性方法。但是第二个抛出org.hibernate.lazyInitializationException:未能懒洋洋地初始化角色集合:com.corpobids.server.entity.BidRequest.Hotels,无法初始化代理-没有会话

我甚至模仿第一个异步方法结构来修改第二个:

@Async
    public void sendCancelledBidRequestEmail(BidRequest bidRequest, String reason) {
        this.sendCancelledBidRequestEmailToSupplier(bidRequest, reason);
    }

    @Transactional
    public void sendCancelledBidRequestEmailToSupplier(BidRequest bidRequest, String reason) {
        this.sendCancelledBidRequestEmailToSupplier(bidRequest, bidRequest.getHotels(), reason);
    }

    @Transactional
    public void sendCancelledBidRequestEmailToSupplier(BidRequest bidRequest, List<Hotel> hotelList, String reason) {
        for (Hotel hotel : hotelList) {   // exception in this line
               ...
               this.sender.send();
            }
    }
}

这一次,它给出了java.lang.IllegalStateException:org.hibernate.resource.jdbc.internal.logicalConnectionManagedimpl@fce9b7b is closed

我想知道我的代码中的缺失点,任何帮助都将不胜感激。

共有1个答案

东门子昂
2023-03-14

您在JPA方面有问题。

在JPA中,关系OneToMany有两种行为:懒惰和渴望。

您可以查看一个很好的解释:Java持久化API中FetchType LAZY和EAGER之间的区别?

    null
 类似资料:
  • 我有两个模块,一个从rest模板调用另一个。(管理员调用notifServer)notifServer有一个用Async注释的方法。我想在该方法中抛出一个异常,但管理员获取响应太快,并且无法在admin中捕获异常方法。 我是spring和@Async进程的新成员。我已经尝试将响应主体从NotifServer映射到C的CompletableFuture。类 。但我仍然没有得到错误响应。 此代码来自管

  • null 所有步骤2、3和4都将在一个带有@async注释的方法中执行。问题是,如果我重新启动后端服务器,只发送一个下载请求,一切都很好,这意味着电子邮件可以收到。但发送更多下载请求后就不起作用了。不会再发送电子邮件。没有错误,没有警告,但所有需要的数据都被正确接收,只是没有电子邮件被发送出去。 有人知道它的问题是什么吗? 我的电子邮件发件人:

  • 我在尝试执行此代码时遇到以下错误。 java.lang.IllegalArgumentException:在“com.app.aggregatorappaconfiguration”上找不到ConfigurationProperties注释。在org.springframework.util.assert.NotNull(assert.java:115)~[spring-core-4.3.2.re

  • 我对@Async和Rest模板调用有问题;下面是我的主要应用程序类,带有一个任务执行器Bean和EnableAsync注释 这是我在Rest控制器中调用的带有异步注释的my测试服务: 此服务在rest模板上返回一个nullPointer;这是stacktrace 但是如果我删除@enableAsync和@Async,那么简单的Rest模板可以很好地工作。 当我传递HttpServlet请求时,Ec

  • 我理解对了吗?

  • [dispatcherServlet]:路径为[]的上下文中servlet[dispatcherServlet]的servlet.service()引发异常[请求处理失败;] 对此有什么意见吗?