Java 在Vertx EventBus使用者中使用惰性集合的JPA会话
我在Vert.x eventbus上创建了一个消费者: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); }); } 在上
@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);
}