From f7c9452ac2491cff31a23260e2bc5edb92831990 Mon Sep 17 00:00:00 2001 From: Davide D'Alto Date: Thu, 18 Mar 2021 09:13:50 +0000 Subject: [PATCH] [#15834] Test on PostgresSQL HQL spanning multiple tables with Hibernate Reactive --- ...ateReactiveTestEndpointJoinedSubclass.java | 123 ++++++++++++++++++ ...ernateReactiveJoinedSubclassInGraalIT.java | 7 + .../HibernateReactiveJoinedSubclassTest.java | 28 ++++ 3 files changed, 158 insertions(+) create mode 100644 integration-tests/hibernate-reactive-postgresql/src/main/java/io/quarkus/it/hibernate/reactive/postgresql/HibernateReactiveTestEndpointJoinedSubclass.java create mode 100644 integration-tests/hibernate-reactive-postgresql/src/test/java/io/quarkus/it/hibernate/reactive/postgresql/HibernateReactiveJoinedSubclassInGraalIT.java create mode 100644 integration-tests/hibernate-reactive-postgresql/src/test/java/io/quarkus/it/hibernate/reactive/postgresql/HibernateReactiveJoinedSubclassTest.java diff --git a/integration-tests/hibernate-reactive-postgresql/src/main/java/io/quarkus/it/hibernate/reactive/postgresql/HibernateReactiveTestEndpointJoinedSubclass.java b/integration-tests/hibernate-reactive-postgresql/src/main/java/io/quarkus/it/hibernate/reactive/postgresql/HibernateReactiveTestEndpointJoinedSubclass.java new file mode 100644 index 0000000000000..dc875d15d5a75 --- /dev/null +++ b/integration-tests/hibernate-reactive-postgresql/src/main/java/io/quarkus/it/hibernate/reactive/postgresql/HibernateReactiveTestEndpointJoinedSubclass.java @@ -0,0 +1,123 @@ +package io.quarkus.it.hibernate.reactive.postgresql; + +import java.util.Objects; + +import javax.inject.Inject; +import javax.persistence.DiscriminatorValue; +import javax.persistence.Entity; +import javax.persistence.Id; +import javax.persistence.Inheritance; +import javax.persistence.InheritanceType; +import javax.persistence.Table; +import javax.ws.rs.DELETE; +import javax.ws.rs.POST; +import javax.ws.rs.Path; +import javax.ws.rs.PathParam; + +import org.hibernate.reactive.mutiny.Mutiny; + +import io.smallrye.mutiny.Uni; + +/** + * We want to check that the right {@link org.hibernate.hql.spi.id.MultiTableBulkIdStrategy} + * is set when using Hibernate Reactive. + * + * @see io.quarkus.hibernate.reactive.runtime.boot.FastBootReactiveEntityManagerFactoryBuilder + * @see org.hibernate.reactive.bulk.impl.ReactiveBulkIdStrategy + */ +@Path("/hr-joinedsubclass") +public class HibernateReactiveTestEndpointJoinedSubclass { + + @Inject + Mutiny.Session session; + + @DELETE + @Path("/deleteBook/{bookId}") + public Uni deleteBook(@PathParam("bookId") Integer bookId) { + return session.withTransaction(tx -> session + .createQuery("delete BookJS where id=:id") + .setParameter("id", bookId) + .executeUpdate()) + .chain(() -> session.find(SpellBook.class, bookId)); + } + + @POST + @Path("/prepareDb") + public Uni prepareDb() { + final SpellBook spells = new SpellBook(6, "Necronomicon", true); + + return session.persist(spells) + .chain(session::flush); + } + + @Entity(name = "SpellBookJS") + @Table(name = "SpellBookJS") + @DiscriminatorValue("S") + public static class SpellBook extends Book { + + private boolean forbidden; + + public SpellBook(Integer id, String title, boolean forbidden) { + super(id, title); + this.forbidden = forbidden; + } + + SpellBook() { + } + + public boolean getForbidden() { + return forbidden; + } + } + + @Entity(name = "BookJS") + @Table(name = "BookJS") + @Inheritance(strategy = InheritanceType.JOINED) + public static class Book { + + @Id + private Integer id; + private String title; + + public Book() { + } + + public Book(Integer id, String title) { + this.id = id; + this.title = title; + } + + public Integer getId() { + return id; + } + + public void setId(Integer id) { + this.id = id; + } + + public String getTitle() { + return title; + } + + public void setTitle(String title) { + this.title = title; + } + + @Override + public boolean equals(Object o) { + if (this == o) { + return true; + } + if (o == null || getClass() != o.getClass()) { + return false; + } + Book book = (Book) o; + return Objects.equals(title, book.title); + } + + @Override + public int hashCode() { + return Objects.hash(title); + } + } +} diff --git a/integration-tests/hibernate-reactive-postgresql/src/test/java/io/quarkus/it/hibernate/reactive/postgresql/HibernateReactiveJoinedSubclassInGraalIT.java b/integration-tests/hibernate-reactive-postgresql/src/test/java/io/quarkus/it/hibernate/reactive/postgresql/HibernateReactiveJoinedSubclassInGraalIT.java new file mode 100644 index 0000000000000..80dfdf5d44ddd --- /dev/null +++ b/integration-tests/hibernate-reactive-postgresql/src/test/java/io/quarkus/it/hibernate/reactive/postgresql/HibernateReactiveJoinedSubclassInGraalIT.java @@ -0,0 +1,7 @@ +package io.quarkus.it.hibernate.reactive.postgresql; + +import io.quarkus.test.junit.NativeImageTest; + +@NativeImageTest +public class HibernateReactiveJoinedSubclassInGraalIT extends HibernateReactiveJoinedSubclassTest { +} diff --git a/integration-tests/hibernate-reactive-postgresql/src/test/java/io/quarkus/it/hibernate/reactive/postgresql/HibernateReactiveJoinedSubclassTest.java b/integration-tests/hibernate-reactive-postgresql/src/test/java/io/quarkus/it/hibernate/reactive/postgresql/HibernateReactiveJoinedSubclassTest.java new file mode 100644 index 0000000000000..25df50fd84545 --- /dev/null +++ b/integration-tests/hibernate-reactive-postgresql/src/test/java/io/quarkus/it/hibernate/reactive/postgresql/HibernateReactiveJoinedSubclassTest.java @@ -0,0 +1,28 @@ +package io.quarkus.it.hibernate.reactive.postgresql; + +import static org.hamcrest.Matchers.emptyOrNullString; + +import org.junit.jupiter.api.Test; + +import io.quarkus.test.common.http.TestHTTPEndpoint; +import io.quarkus.test.junit.QuarkusTest; +import io.restassured.RestAssured; + +@QuarkusTest +@TestHTTPEndpoint(HibernateReactiveTestEndpointJoinedSubclass.class) +public class HibernateReactiveJoinedSubclassTest { + + @Test + public void deleteBookQuery() { + RestAssured.when() + .post("/prepareDb") + .then() + .statusCode(204); + + RestAssured.when() + .delete("/deleteBook/6") + .then() + .statusCode(204) + .body(emptyOrNullString()); + } +}