Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/hibernate/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Hibernate 如何使用Vert.xWeb获取当前的web请求?_Hibernate_Orm_Kotlin_Vert.x_Reactive - Fatal编程技术网

Hibernate 如何使用Vert.xWeb获取当前的web请求?

Hibernate 如何使用Vert.xWeb获取当前的web请求?,hibernate,orm,kotlin,vert.x,reactive,Hibernate,Orm,Kotlin,Vert.x,Reactive,我正在使用Hibernate(JPA)+Vert.xWeb(Kotlin)编写一个项目,我需要将EntityManager绑定到Web请求,我的意思是我想为每个Web请求创建EntityManager。我需要使用一些静态方法(Kotlin中的对象)从VertX获取当前的web请求。有办法吗?还是因为VertX是反应式的,所以我走错了方向?您通常应该在一个垂直中初始化EntityManager,在另一个垂直中处理web请求。使用EventBus进行通信。大致如下(代码不准确): 公共类DBVert

我正在使用Hibernate(JPA)+Vert.xWeb(Kotlin)编写一个项目,我需要将EntityManager绑定到Web请求,我的意思是我想为每个Web请求创建EntityManager。我需要使用一些静态方法(Kotlin中的对象)从VertX获取当前的web请求。有办法吗?还是因为VertX是反应式的,所以我走错了方向?

您通常应该在一个垂直中初始化EntityManager,在另一个垂直中处理web请求。使用EventBus进行通信。大致如下(代码不准确):

公共类DBVerticle扩展了AbstractVerticle{
public void start()引发异常{
EntityManager em=…;//初始化您的em
vertx.eventBus().consumer(“您想要什么的一些描述”).handler(h->{
结果集rs=em.doSomeQuery();
h、 答复(卢比);
});
}
}
公共类WebVerticle扩展了AbstractVerticle{
public void start()引发异常{
HttpServer服务器=vertx.createHttpServer();
路由器=路由器。路由器(vertx);
router.get(“/”)处理程序(ctx->{
vertx.eventBus().send(“你想要什么的一些描述”,“可能有效负载”,结果->{
if(result.successed()){
ctx.结束(结果);
}
});
});
处理程序(路由器::接受);
}
}

您可以在这里看到一个示例:

如果我理解正确,您希望根据请求初始化您的实体管理器,并使其在以后的任何处理程序中可用。在这种情况下,您可以执行以下操作:

public class MainVerticle extends AbstractVerticle {
  public void start() throws Exception {

    HttpServer server = vertx.createHttpServer();
    Router router = Router.router(vertx);

    router.route().handler(ctx -> {
      EntityManager em = ...; //init your EM
      ctx.put("em", em);
      ctx.next();
      // as of this moment the entity manager is available for all
      // handlers in the current request by the key "em" 
    }

    router.get("/").handler(ctx -> {
      EntityManager em = ctx.get("em");
      // use it as you would...
      ctx.response().end(/* your response here... */);
    });

    server.handler(router::accept);
  }
}

请注意,此代码永远不会关闭/处置您的实体管理器,您可能需要在某个位置添加一个结束处理程序/异常处理程序来关闭它。

这是一个很好的答案!但是我需要牺牲我的存储库模式来使用这种方法:我必须发送例如实体类型和Id,并期望垂直体返回Id为其键的项目!但我现在使用一个BaseRepository作为父级,使用几个存储库类来执行DB操作。我如何才能将您的方式与存储库混合使用?@Kamyar在实践中,您会将每个存储库包装成一个竖线。因此,你将发送“苹果”或“香蕉”,而不是“你想要什么的一些描述”,并将其用于特定的回购。另外请注意,您可以通过EventBus发送任何有效负载,例如,您可以发送对象ID!即使在您的情况下,我也必须以某种方式发送我最喜欢的操作(添加、删除、编辑…)。我认为制作这么多的竖线是一种代码味道!也许我没有正确地解释自己。您不必为每个方法创建垂直。您可以根据存储库创建垂直体。操作的名称是与存储库商定的名称。有效负载可以是以下形式的JSON:
{“action”:“DELETE”,“id”:123}
。您的repository verticle可以获取此对象,并调用您在repo中声明的任何方法。但您的解决方案并不是很好!这也是一种代码气味!我尝试过,但在这种情况下,我必须将entityManager传递给我的存储库,这不是我最喜欢的方式!顺便说一句,我用这种方法得到的唯一一件事就是集中实体管理器实例化,我可以用IoC代替它!我可以省略您的方式,而是在每个处理程序的第一行开始创建对象,并在最后一行结束!这里的第一行替换为上下文,最后一行必须替换为next(),以使另一行关闭实体管理器!您认为您的方法有用吗?您说过您希望每个请求都有一个实体管理器,所以上面的示例为您提供了这一点。它还允许您从其他处理程序访问管理器,即使在其他类文件上声明。
public class MainVerticle extends AbstractVerticle {
  public void start() throws Exception {

    HttpServer server = vertx.createHttpServer();
    Router router = Router.router(vertx);

    router.route().handler(ctx -> {
      EntityManager em = ...; //init your EM
      ctx.put("em", em);
      ctx.next();
      // as of this moment the entity manager is available for all
      // handlers in the current request by the key "em" 
    }

    router.get("/").handler(ctx -> {
      EntityManager em = ctx.get("em");
      // use it as you would...
      ctx.response().end(/* your response here... */);
    });

    server.handler(router::accept);
  }
}