Java 在Vertx EventBus使用者中使用惰性集合的JPA会话

Java 在Vertx EventBus使用者中使用惰性集合的JPA会话,java,spring-boot,jpa,vert.x,Java,Spring Boot,Jpa,Vert.x,我在Vert.x eventbus上创建了一个消费者: @Autowired private Vertx vertx; public void registerConsumer() { EventBus eb = vertx.eventBus(); eb.consumer("action.request", (Message<String> msg) -> { handleIncomingRequest(msg); }); } 在上

我在Vert.x eventbus上创建了一个消费者:

@Autowired
private Vertx vertx;

public void registerConsumer() {
    EventBus eb = vertx.eventBus();

    eb.consumer("action.request", (Message<String> msg) -> {
        handleIncomingRequest(msg);
    });
}
在上面的方法中,我尝试对
SystemNode
对象中的集合执行一些操作。但是,此对象上延迟初始化的集合永远不会被提取。我已尝试设置
@Fetch(FetchMode.JOIN)
FetchType.EAGER
。当我检查对象时,我可以看到它是一个持久集,并显示以下错误:

调用方法时发生com.sun.jdi.InvocationException

进一步检查表明,与此集合相关的会话为空,因此调用
Hibernate.initialize(system.getSomeCollection())
将引发异常

这两种方法都解决了问题,但这不是一个选项,因为集合太大,如果不使用它,每次都无法获取

在eventbus使用者之外的任何地方调用该服务,可以根据需要初始化一个集合


我做错了什么?

好吧,您应该将传入请求处理逻辑封装到一个事务方法中,以防止在调用
systemService.getSystemWithHistoryFrom()
systemService.update()
之间分离实体。类似于
@Transactional public void SystemService.getsystemhistorydoimportantstuff和saveresults()


或者,您可以将
systemService.getSystemWithHistoryFrom()
执行的查询自定义为
JOIN FETCH
所有必要的集合,并使集合在实体本身内延迟获取。但是,将整个业务逻辑包装在事务中要安全得多,因为它除了解决您的问题外,还强制执行事务隔离

那么,您应该将传入请求处理逻辑包装到一个事务方法中,以防止实体在调用
systemService.getSystemWithHistoryFrom()
systemService.update()
之间分离。类似于
@Transactional public void SystemService.getsystemhistorydoimportantstuff和saveresults()


或者,您可以将
systemService.getSystemWithHistoryFrom()
执行的查询自定义为
JOIN FETCH
所有必要的集合,并使集合在实体本身内延迟获取。但是,将整个业务逻辑包装在事务中要安全得多,因为它除了解决您的问题外,还强制执行事务隔离

你是对的,我把应该是事务性的逻辑移到了一个新的类中,并用
@transactional
注释了入口点,它似乎是基于我迄今为止所做的尝试而工作的。非常感谢。你是对的,我把应该是事务性的逻辑移到了一个新的类中,并用
@transactional
注释了入口点,它似乎是基于我迄今为止所做的尝试而工作的。非常感谢。
private void handleIncomingRequest(Request request) {
    SystemNode system = systemService
            .getSystemWithHistoryFrom(request.getUuid());

    // All lazily initialized collections unavailable here

    systemService.update(system);
}