Hibernate-reactive: openSession() рд╡рд╛рдкрд╕реА рддреНрд░реБрдЯрд┐ "рдЗрд╕реЗ Vert.x рдИрд╡реЗрдВрдЯ рд▓реВрдк рдкрд░ рдЪрд▓рд╛рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ"

рдХреЛ рдирд┐рд░реНрдорд┐рдд 12 рдордИ 2021  ┬╖  7рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ  ┬╖  рд╕реНрд░реЛрдд: hibernate/hibernate-reactive

рдирдорд╕реНрддреЗ,

рдЕрдм рддрдХ рд╣рд╛рдЗрдмрд░рдиреЗрдЯ рд░рд┐рдПрдХреНрдЯрд┐рд╡ рдПрдкреАрдЖрдИ (1.0.0.CR4) рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реБрдП рд╡рд░реНрдЯреЗрдХреНрд╕ рдХреЗрд╡рд▓ рдореБрдЭрд╕реЗ рдЫрд┐рдкрд╛ рд╣реБрдЖ рдерд╛ред рд▓реЗрдХрд┐рди рдореБрдЭреЗ рдПрдХ рд╕рддреНрд░ рд╡рд╛рдкрд╕ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдПрдкреАрдЖрдИ рдХрд╛ рдкрд░реНрджрд╛рдлрд╛рд╢ рдХрд░рдирд╛ рд╣реЛрдЧрд╛ рдЬрд┐рд╕реЗ рддрдм рддрдХ рдЦреБрд▓рд╛ рд░рдЦрд╛ рдЬрд╛рдПрдЧрд╛ рдЬрдм рддрдХ рдХрд┐ рдЗрд╕ рдПрдкреАрдЖрдИ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рдЧреНрд░рд╛рд╣рдХ рдЗрд╕реЗ рдмрдВрдж рдХрд░рдиреЗ рдХрд╛ рдлреИрд╕рд▓рд╛ рдирд╣реАрдВ рдХрд░реЗрдВрдЧреЗред
рдореИрдВ рдЬреВрдирд┐рдЯ рдкрд░реАрдХреНрд╖рдг рдЪрд▓рд╛ рд░рд╣рд╛ рд╣реВрдВ, рдФрд░ рдореЗрд░реЗ рдкрд╛рд╕ рдирд┐рдореНрди рдПрдкреАрдЖрдИ рд╣реИ:

    public Stage.Session openSession() throws ExecutionException, InterruptedException {
        if (session != null && session.isOpen()) {
            session.close();
        }
        Stage.Session newSession = sessionFactory.openSession();
        this.session = newSession;
        return newSession ;
   }

рдФрд░ рдореЗрд░реЗ рдЬреВрдирд┐рдЯ рдЯреЗрд╕реНрдЯ рдореЗрдВ:
Stage.Session session = deviceRepository.openSession();
рдЬрдм рдореИрдВ рдХреЛрдб рдЪрд▓рд╛рддрд╛ рд╣реВрдВ рддреЛ рдореБрдЭреЗ рддреНрд░реБрдЯрд┐ рдорд┐рд▓рддреА рд╣реИ:
This needs to be run on the Vert.x event loop
рдореИрдВрдиреЗ рдХреЛрдб рдХреЛ рдХрдИ рдЕрд▓рдЧ-рдЕрд▓рдЧ рддрд░реАрдХреЛрдВ рд╕реЗ рджреЛрдмрд╛рд░рд╛ рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХреА рд▓реЗрдХрд┐рди рдореИрдВ рдЗрд╕реЗ рдЪрд▓рд╛рдиреЗ рдореЗрдВ рд╕рдлрд▓ рдирд╣реАрдВ рд╣реБрдЖред

рдХреНрдпрд╛ рдЖрдк рдХреГрдкрдпрд╛ рдореБрдЭреЗ рдЕрдкрдиреА рд╕рд┐рдлрд╛рд░рд┐рд╢ рджреЗ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рдЗрд╕реЗ рд╕рд╣реА рддрд░реАрдХреЗ рд╕реЗ рдХреИрд╕реЗ рдХрд┐рдпрд╛ рдЬрд╛рдП?

рдзрдиреНрдпрд╡рд╛рджред

рд╕рдмрд╕реЗ рдЙрдкрдпреЛрдЧреА рдЯрд┐рдкреНрдкрдгреА

рд╣рд╛рдВ рдореИрдВ

рд╕рднреА 7 рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

рдирдорд╕реНрддреЗ,
рд╕рддреНрд░ рдХреЗ рд╕рд╛рде рд╕рдорд╕реНрдпрд╛ рдпрд╣ рд╣реИ рдХрд┐ рдпрд╣ рдереНрд░реЗрдб-рд╕реБрд░рдХреНрд╖рд┐рдд рдирд╣реАрдВ рд╣реИ, рдЗрд╕реЗ рд╡рд┐рднрд┐рдиреНрди рдереНрд░реЗрдбреНрд╕ рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рд╕реЗ рд╕рдорд╕реНрдпрд╛рдПрдБ рд╣реЛ рд╕рдХрддреА рд╣реИрдВ рдЬрд┐рдиреНрд╣реЗрдВ рдбреАрдмрдЧ рдХрд░рдирд╛ рдХрдард┐рди рд╣реИред рд╕рд╛рде рд╣реА, рдЬрдм рдХреЛрдИ рдирдпрд╛ рд╕рддреНрд░ рдмрдирд╛рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рддреЛ рд╡рд╣ Vert.x рд╕рдВрджрд░реНрдн рдХреЗ рд▓рд┐рдП рдмрд╛рдзреНрдп рд╣реЛрддрд╛ рд╣реИ рдФрд░ рдЙрд╕рдХреЗ рдмрд╛рдж рдЙрд╕реА рд╕рдВрджрд░реНрдн рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИред

рдЖрдорддреМрд░ рдкрд░ рд╣рд╛рдЗрдмрд░рдиреЗрдЯ рд░рд┐рдПрдХреНрдЯрд┐рд╡ рджреНрд╡рд╛рд░рд╛ рдЗрд╕рдХрд╛ рдзреНрдпрд╛рди рд░рдЦрд╛ рдЬрд╛рддрд╛ рд╣реИ рдЬрдм рдХреЛрдИ SessionFactory#withTransaction рдФрд░ SessionFactory#withSession ред

рдЖрдкрдХреЗ рдкрд░реАрдХреНрд╖рдг рдХрд╛рдо рдирд╣реАрдВ рдХрд░ рд░рд╣реЗ рд╣реИрдВ рдХреНрдпреЛрдВрдХрд┐ рд╡реЗ рдЬреБрдиреАрдЯ рдереНрд░реЗрдб рдореЗрдВ рдЪрд▓рддреЗ рд╣реИрдВ, рди рдХрд┐ Vert.x рдореЗрдВред
JUnit 4 рдореЗрдВ рдЗрд╕ рд╕рдорд╕реНрдпрд╛ рдХреЛ рд╣рд▓ рдХрд░рдиреЗ рдХрд╛ рдПрдХ рддрд░реАрдХрд╛ рдкреБрд╕реНрддрдХрд╛рд▓рдп рдореЗрдВ рд╢рд╛рдорд┐рд▓ рдПрдХ рдирд┐рдпрдо рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рд╣реИ io.vertx:vertx-unit:4.0.3 :

<strong i="13">@Rule</strong>
public RunTestOnContext vertxContextRule = new RunTestOnContext();

рдпрд╣ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░реЗрдЧрд╛ рдХрд┐ рдЖрдкрдХреЗ рдкрд░реАрдХреНрд╖рдг Vert.x рд╕рдВрджрд░реНрдн рдореЗрдВ рдЪрд▓рддреЗ рд╣реИрдВ ред

рд╣рд╛рд▓рд╛рдВрдХрд┐ рдпрд╣ рдкрд░реНрдпрд╛рдкреНрдд рдирд╣реАрдВ рд╣реИ, рдЖрдкрдХреЛ рдпрд╣ рднреА рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ рдХрд┐ рд╕рддреНрд░ рдирд┐рдпрдо рджреНрд╡рд╛рд░рд╛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдЙрд╕реА Vert.x рд╕рдВрджрд░реНрдн рдХреЗ рд▓рд┐рдП рдмрд╛рдзреНрдп рд╣реИред

рд╡рд░реНрдЯреЗрдХреНрд╕ рдЗрдВрд╕реНрдЯреЗрдВрд╕ рд╕реЗрд╡рд╛:

рд╕рд╛рдорд╛рдиреНрдп рддреМрд░ рдкрд░, рдЗрд╕реЗ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХрд╛ рддрд░реАрдХрд╛ рдПрдХ рдХрд╕реНрдЯрдо VertxInstance рд╕реЗрд╡рд╛ рдмрдирд╛рдирд╛ рд╣реИ ред

рдпрд╣ рд╕реЗрд╡рд╛ рд╣рд╛рдЗрдмрд░рдиреЗрдЯ рд░рд┐рдПрдХреНрдЯрд┐рд╡ рдХреЛ рдмрддрд╛рддреА рд╣реИ рдХрд┐ рд╕рддреНрд░ рдмрдирд╛рддреЗ рд╕рдордп рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рд╣реА Vert.x рдЗрдВрд╕реНрдЯреЗрдВрд╕ рдХреИрд╕реЗ рдкреНрд░рд╛рдкреНрдд рдХрд░реЗрдВред
рдпрджрд┐ рдЖрдк рд╕рддреНрд░ рдлреИрдХреНрдЯреНрд░реА рдХреЛ рдкреНрд░реЛрдЧреНрд░рд╛рдореЗрдЯрд┐рдХ рд░реВрдк рд╕реЗ рдмрдирд╛рддреЗ рд╣реИрдВ, рддреЛ рдпрд╣рд╛рдВ рдПрдХ рдЙрджрд╛рд╣рд░рдг рджрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ рдХрд┐ рдЖрдк рдЗрд╕реЗ рдХреИрд╕реЗ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:

Configuration configuration = new Configuration();
StandardServiceRegistryBuilder builder = new ReactiveServiceRegistryBuilder()
                .addService( VertxInstance.class, (VertxInstance) () -> getMyVertxInstance())
                .applySettings( configuration.getProperties() );
StandardServiceRegistry registry = builder.build();
SessionFactory sessionFactory = configuration.buildSessionFactory( registry );

рд╡реИрдХрд▓реНрдкрд┐рдХ рд░реВрдк рд╕реЗ, рдЖрдк рдЗрд╕реЗ JDK рдХреЗ

  1. рдХреЗ рдЕрдВрддрд░реНрдЧрдд org.hibernate.reactive.vertx.VertxInstance рдирд╛рдо рдХреА рдПрдХ рдЯреЗрдХреНрд╕реНрдЯ рдлрд╝рд╛рдЗрд▓ рдЬреЛрдбрд╝реЗрдВ
    /META-INF/services/
  2. рдЯреЗрдХреНрд╕реНрдЯ рдлрд╝рд╛рдЗрд▓ рдореЗрдВ VertxInstance рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рд╡рд░реНрдЧ рдХрд╛ рдкрде рд╣реЛрдЧрд╛:
    org.myproject.MyVertxProvider

рдЕрдм рд╣рд╛рдЗрдмрд░рдиреЗрдЯ рд░рд┐рдПрдХреНрдЯрд┐рд╡ MyVertxProvider рдХрд╛ рдПрдХ рдЙрджрд╛рд╣рд░рдг рдХреЙрд▓ рдХрд░реЗрдЧрд╛ рдЬрдм рдПрдХ Vert.x рдЙрджрд╛рд╣рд░рдг рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдЧреА рдФрд░ рдпрджрд┐ рдЖрдкрдХрд╛ рдХреЛрдб рдЙрд╕реА Vert.x рд╕рдВрджрд░реНрдн рдореЗрдВ рдЪрд▓рддрд╛ рд╣реИ, рддреЛ рд╕рдм рдХреБрдЫ рдХрд╛рдо рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдПред

JUnit 4 рдХреЗ рд╕рд╛рде рд╕рдорд╕реНрдпрд╛ рдХреЛ рдареАрдХ рдХрд░рдирд╛:

рдкрд░реАрдХреНрд╖рдгреЛрдВ рдкрд░ рд╡рд╛рдкрд╕ рдЬрд╛рдирд╛, рдЙрдиреНрд╣реЗрдВ рдареАрдХ рдХрд░рдиреЗ рдХрд╛ рдПрдХ рддрд░реАрдХрд╛ рдпрд╣ рд╣реЛрдЧрд╛:

<strong i="41">@Rule</strong>
public RunTestOnContext vertxContextRule = new RunTestOnContext();

...

Configuration configuration = new Configuration();
StandardServiceRegistryBuilder builder = new ReactiveServiceRegistryBuilder()
                .addService( VertxInstance.class, (VertxInstance) () -> vertxContextRule.vertx() )
                .applySettings( configuration.getProperties() );
SessionFactory sessionFactory = configuration.buildSessionFactory(  builder.build() );

рдпрджрд┐ рдЖрдк рдирд┐рдпрдо рдХрд╛ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд░ рд░рд╣реЗ рд╣реИрдВ, рддреЛ рдЖрдк рдирд┐рдореНрди рддрд░реАрдХреЗ рд╕реЗ рдПрдХ рд╡рд┐рд╢рд┐рд╖реНрдЯ Vert.x рд╕рдВрджрд░реНрдн рдореЗрдВ рдХреЛрдб рдЪрд▓рд╛ рд╕рдХрддреЗ рд╣реИрдВ:

Context currentContext = Vertx.currentContext();
currentContext.runOnContext( event -> {
   // Here you should be able to use the session
});

рдЖрдкрдХреЛ рд╡реЗрдмрд╕рд╛рдЗрдЯ рдкрд░ рдпрд╛ рдХрд╣реАрдВ рднреА рдПрдХ FAQ рдХреЗ рд░реВрдк рдореЗрдВ рдЬреЛ рдХреБрдЫ рдЖрдкрдиреЗ рд▓рд┐рдЦрд╛ рд╣реИ рдЙрд╕реЗ рдЬреЛрдбрд╝рдирд╛ рдЪрд╛рд╣рд┐рдПред

рд╣рд╛рдВ рдореИрдВ

@ рдбреЗрд╡рд┐рдб рдбреА рдЖрдкрдХреЗ рд╕реНрдкрд╖реНрдЯреАрдХрд░рдг рдХреА рдмрд╣реБрдд рд╕рд░рд╛рд╣рдирд╛ рдХрд░рддрд╛ рд╣реИред рдзрдиреНрдпрд╡рд╛рджред

рдореИрдВрдиреЗ рджрд╕реНрддрд╛рд╡реЗрдЬрд╝реАрдХрд░рдг/рд╡реЗрдмрд╕рд╛рдЗрдЯ рдореЗрдВ рдЗрди рдкрд░рд┐рд╡рд░реНрддрдиреЛрдВ рдХрд╛ рдЯреНрд░реИрдХ рд░рдЦрдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рд╕рдорд╕реНрдпрд╛ рдмрдирд╛рдИ рд╣реИ: https://github.com/hibernate/hibernate-reactive/issues/751

рдореИрдВ рдЗрд╕ рдореБрджреНрджреЗ рдХреЛ рдмрдВрдж рдХрд░рдиреЗ рдЬрд╛ рд░рд╣рд╛ рд╣реВрдВред рдмреЗрдЭрд┐рдЭрдХ рдЕрдзрд┐рдХ рдкреНрд░рд╢реНрди рдкреВрдЫреЗрдВ рдХреБрдЫ рдФрд░ рд╕реНрдкрд╖реНрдЯ рдирд╣реАрдВ рд╣реИред

рдзрдиреНрдпрд╡рд╛рджред

@DavidD рдХреНрдпрд╛ рдЖрдкрдХреЗ рджреНрд╡рд╛рд░рд╛ рдкрд╣рд▓реЗ рдЙрд▓реНрд▓реЗрдЦрд┐рдд рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдХреЛрдб рдХрд╛ рдЙрдкрдпреЛрдЧ JUnit 5 рдХреЗ рд╕рд╛рде рдХрд░рдирд╛ рд╕рдВрднрд╡ рд╣реИ?

Context currentContext = Vertx.currentContext();
currentContext.runOnContext( event -> {
   // Here you should be able to use the session
});

рд╣рд╛рдБ, рд╡рд╣ рдХреЛрдб Vert.x рд╣реИ, JUnit рдирд╣реАрдВред

рд▓реЗрдХрд┐рди t рдпрд╣рд╛рдБ JUnit 5 рдХреЗ рд▓рд┐рдП

<strong i="8">@Rule</strong>
public RunTestOnContext vertxContextRule = new RunTestOnContext();
рдХреНрдпрд╛ рдпрд╣ рдкреГрд╖реНрда рдЙрдкрдпреЛрдЧреА рдерд╛?
0 / 5 - 0 рд░реЗрдЯрд┐рдВрдЧреНрд╕

рд╕рдВрдмрдВрдзрд┐рдд рдореБрджреНрджреЛрдВ

yaakov-berkovitch picture yaakov-berkovitch  ┬╖  16рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

gavinking picture gavinking  ┬╖  6рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

pqab picture pqab  ┬╖  21рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

markusdlugi picture markusdlugi  ┬╖  30рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

DavideD picture DavideD  ┬╖  17рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ