From f5988a4aada53232c0c6ccfe814e3a78694eb506 Mon Sep 17 00:00:00 2001 From: Gavin King Date: Mon, 17 Feb 2025 14:26:18 +0100 Subject: [PATCH 1/3] [#2122] add StatelessSession.get() accepting multiple ids and add missing overloads of Mutiny.StatelessSession.createQuery() Also add tests for Mutiny.StatelessSession which were missing --- .../org/hibernate/reactive/mutiny/Mutiny.java | 33 +++ .../impl/MutinyStatelessSessionImpl.java | 17 ++ .../session/ReactiveStatelessSession.java | 8 +- .../impl/ReactiveStatelessSessionImpl.java | 37 ++- .../org/hibernate/reactive/stage/Stage.java | 12 + .../stage/impl/StageStatelessSessionImpl.java | 5 + .../reactive/MutinyStatelessSessionTest.java | 271 ++++++++++++++++++ .../ReactiveStatelessSessionTest.java | 17 ++ 8 files changed, 396 insertions(+), 4 deletions(-) create mode 100644 hibernate-reactive-core/src/test/java/org/hibernate/reactive/MutinyStatelessSessionTest.java diff --git a/hibernate-reactive-core/src/main/java/org/hibernate/reactive/mutiny/Mutiny.java b/hibernate-reactive-core/src/main/java/org/hibernate/reactive/mutiny/Mutiny.java index c561a4124..e6cdab9d5 100644 --- a/hibernate-reactive-core/src/main/java/org/hibernate/reactive/mutiny/Mutiny.java +++ b/hibernate-reactive-core/src/main/java/org/hibernate/reactive/mutiny/Mutiny.java @@ -40,6 +40,7 @@ import jakarta.persistence.CacheRetrieveMode; import jakarta.persistence.CacheStoreMode; import jakarta.persistence.EntityGraph; +import jakarta.persistence.FindOption; import jakarta.persistence.FlushModeType; import jakarta.persistence.LockModeType; import jakarta.persistence.Parameter; @@ -617,6 +618,8 @@ default Uni find(Class entityClass, Object id, LockModeType lockModeTy * @param ids the identifiers * * @return a list of persistent instances and nulls via a {@code Uni} + * + * @see org.hibernate.Session#findMultiple(Class, List, FindOption...) */ Uni> find(Class entityClass, Object... ids); @@ -1569,6 +1572,18 @@ interface StatelessSession extends Closeable { */ Uni get(Class entityClass, Object id); + /** + * Retrieve multiple rows. + * + * @param entityClass The class of the entity to retrieve + * @param ids The ids of the entities to retrieve + * + * @return a list of detached entity instances, via a {@code Uni} + * + * @see org.hibernate.StatelessSession#getMultiple(Class, List) + */ + Uni> get(Class entityClass, Object... ids); + /** * Retrieve a row, obtaining the specified lock mode. * @@ -1737,6 +1752,24 @@ default Uni get(Class entityClass, Object id, LockModeType lockModeTyp */ SelectionQuery createQuery(CriteriaQuery criteriaQuery); + /** + * Create an instance of {@link MutationQuery} for the given criteria update. + * + * @param criteriaUpdate The {@link CriteriaUpdate} + * + * @return The {@link MutationQuery} instance for manipulation and execution + */ + MutationQuery createQuery(CriteriaUpdate criteriaUpdate); + + /** + * Create an instance of {@link MutationQuery} for the given criteria delete. + * + * @param criteriaDelete The {@link CriteriaDelete} + * + * @return The {@link MutationQuery} instance for manipulation and execution + */ + MutationQuery createQuery(CriteriaDelete criteriaDelete); + /** * Insert a row. * diff --git a/hibernate-reactive-core/src/main/java/org/hibernate/reactive/mutiny/impl/MutinyStatelessSessionImpl.java b/hibernate-reactive-core/src/main/java/org/hibernate/reactive/mutiny/impl/MutinyStatelessSessionImpl.java index 105672837..473196712 100644 --- a/hibernate-reactive-core/src/main/java/org/hibernate/reactive/mutiny/impl/MutinyStatelessSessionImpl.java +++ b/hibernate-reactive-core/src/main/java/org/hibernate/reactive/mutiny/impl/MutinyStatelessSessionImpl.java @@ -7,7 +7,9 @@ import io.smallrye.mutiny.Uni; import jakarta.persistence.EntityGraph; +import jakarta.persistence.criteria.CriteriaDelete; import jakarta.persistence.criteria.CriteriaQuery; +import jakarta.persistence.criteria.CriteriaUpdate; import org.hibernate.LockMode; import org.hibernate.graph.spi.RootGraphImplementor; import org.hibernate.reactive.common.ResultSetMapping; @@ -53,6 +55,11 @@ public Uni get(Class entityClass, Object id) { return uni( () -> delegate.reactiveGet( entityClass, id ) ); } + @Override + public Uni> get(Class entityClass, Object... ids) { + return uni( () -> delegate.reactiveGet( entityClass, ids ) ); + } + @Override public Uni get(Class entityClass, Object id, LockMode lockMode) { return uni( () -> delegate.reactiveGet( entityClass, id, lockMode, null ) ); @@ -114,6 +121,16 @@ public SelectionQuery createQuery(CriteriaQuery criteriaQuery) { return new MutinySelectionQueryImpl<>( delegate.createReactiveQuery( criteriaQuery ), factory ); } + @Override + public Mutiny.MutationQuery createQuery(CriteriaUpdate criteriaUpdate) { + return new MutinyMutationQueryImpl<>( delegate.createReactiveMutationQuery( criteriaUpdate ), factory ); + } + + @Override + public Mutiny.MutationQuery createQuery(CriteriaDelete criteriaDelete) { + return new MutinyMutationQueryImpl<>( delegate.createReactiveMutationQuery( criteriaDelete ), factory ); + } + @Override public Uni insert(Object entity) { return uni( () -> delegate.reactiveInsert( entity ) ); diff --git a/hibernate-reactive-core/src/main/java/org/hibernate/reactive/session/ReactiveStatelessSession.java b/hibernate-reactive-core/src/main/java/org/hibernate/reactive/session/ReactiveStatelessSession.java index a0b1f81f0..33e34917b 100644 --- a/hibernate-reactive-core/src/main/java/org/hibernate/reactive/session/ReactiveStatelessSession.java +++ b/hibernate-reactive-core/src/main/java/org/hibernate/reactive/session/ReactiveStatelessSession.java @@ -10,6 +10,8 @@ import org.hibernate.reactive.engine.spi.ReactiveSharedSessionContractImplementor; import jakarta.persistence.EntityGraph; + +import java.util.List; import java.util.concurrent.CompletableFuture; import java.util.concurrent.CompletionStage; @@ -26,11 +28,13 @@ @Incubating public interface ReactiveStatelessSession extends ReactiveQueryProducer, ReactiveSharedSessionContractImplementor { - CompletionStage reactiveGet(Class entityClass, Object id); + CompletionStage reactiveGet(Class entityClass, Object id); + + CompletionStage> reactiveGet(Class entityClass, Object... id); CompletionStage reactiveGet(String entityName, Object id); - CompletionStage reactiveGet(Class entityClass, Object id, LockMode lockMode, EntityGraph fetchGraph); + CompletionStage reactiveGet(Class entityClass, Object id, LockMode lockMode, EntityGraph fetchGraph); CompletionStage reactiveGet(String entityName, Object id, LockMode lockMode, EntityGraph fetchGraph); diff --git a/hibernate-reactive-core/src/main/java/org/hibernate/reactive/session/impl/ReactiveStatelessSessionImpl.java b/hibernate-reactive-core/src/main/java/org/hibernate/reactive/session/impl/ReactiveStatelessSessionImpl.java index 230c4a5fb..7ca780e40 100644 --- a/hibernate-reactive-core/src/main/java/org/hibernate/reactive/session/impl/ReactiveStatelessSessionImpl.java +++ b/hibernate-reactive-core/src/main/java/org/hibernate/reactive/session/impl/ReactiveStatelessSessionImpl.java @@ -5,6 +5,8 @@ */ package org.hibernate.reactive.session.impl; +import java.util.ArrayList; +import java.util.List; import java.util.concurrent.CompletableFuture; import java.util.concurrent.CompletionStage; import java.util.function.Supplier; @@ -46,6 +48,8 @@ import org.hibernate.proxy.LazyInitializer; import org.hibernate.query.IllegalMutationQueryException; import org.hibernate.query.criteria.JpaCriteriaInsert; +import org.hibernate.query.criteria.JpaCriteriaQuery; +import org.hibernate.query.criteria.JpaRoot; import org.hibernate.query.hql.spi.SqmQueryImplementor; import org.hibernate.query.named.NamedResultSetMappingMemento; import org.hibernate.query.spi.HqlInterpretation; @@ -204,17 +208,46 @@ public void checkTransactionNeededForUpdateOperation(String exceptionMessage) { } @Override - public CompletionStage reactiveGet(Class entityClass, Object id) { + public CompletionStage reactiveGet(Class entityClass, Object id) { return reactiveGet( entityClass.getName(), id, LockMode.NONE, null ); } + @Override + public CompletionStage> reactiveGet(Class entityClass, Object... ids) { + checkOpen(); + for (Object id : ids) { + if ( id == null ) { + throw new IllegalArgumentException("Null id"); + } + } + + final EntityPersister persister = getEntityPersister( entityClass.getName() ); + + final JpaCriteriaQuery query = getCriteriaBuilder().createQuery(entityClass); + final JpaRoot from = query.from(entityClass); + query.where( from.get( persister.getIdentifierPropertyName() ).in(ids) ); + return createReactiveQuery(query).getReactiveResultList() + .thenApply( resultList -> { + final List idList = new ArrayList<>( resultList.size() ); + for (T entity : resultList) { + idList.add( persister.getIdentifier(entity, this) ); + } + final List list = new ArrayList<>( ids.length ); + for (Object id : ids) { + final int pos = idList.indexOf(id); + list.add( pos < 0 ? null : resultList.get(pos) ); + } + return list; + }); + } + @Override public CompletionStage reactiveGet(String entityName, Object id) { return reactiveGet( entityName, id, LockMode.NONE, null ); } @Override - public CompletionStage reactiveGet(Class entityClass, Object id, LockMode lockMode, EntityGraph fetchGraph) { + public CompletionStage reactiveGet(Class entityClass, Object id, LockMode lockMode, EntityGraph fetchGraph) { return reactiveGet( entityClass.getName(), id, LockMode.NONE, fetchGraph ); } diff --git a/hibernate-reactive-core/src/main/java/org/hibernate/reactive/stage/Stage.java b/hibernate-reactive-core/src/main/java/org/hibernate/reactive/stage/Stage.java index 7741201a0..1cf8f4fed 100644 --- a/hibernate-reactive-core/src/main/java/org/hibernate/reactive/stage/Stage.java +++ b/hibernate-reactive-core/src/main/java/org/hibernate/reactive/stage/Stage.java @@ -1604,6 +1604,18 @@ interface StatelessSession extends Closeable { */ CompletionStage get(Class entityClass, Object id); + /** + * Retrieve multiple rows. + * + * @param entityClass The class of the entity to retrieve + * @param ids The ids of the entities to retrieve + * + * @return a list of detached entity instances, via a {@code Uni} + * + * @see org.hibernate.StatelessSession#getMultiple(Class, List) + */ + CompletionStage> get(Class entityClass, Object... ids); + /** * Retrieve a row, obtaining the specified lock mode. * diff --git a/hibernate-reactive-core/src/main/java/org/hibernate/reactive/stage/impl/StageStatelessSessionImpl.java b/hibernate-reactive-core/src/main/java/org/hibernate/reactive/stage/impl/StageStatelessSessionImpl.java index 8a27d5a07..7724a5cd1 100644 --- a/hibernate-reactive-core/src/main/java/org/hibernate/reactive/stage/impl/StageStatelessSessionImpl.java +++ b/hibernate-reactive-core/src/main/java/org/hibernate/reactive/stage/impl/StageStatelessSessionImpl.java @@ -50,6 +50,11 @@ public CompletionStage get(Class entityClass, Object id) { return delegate.reactiveGet( entityClass, id ); } + @Override + public CompletionStage> get(Class entityClass, Object... ids) { + return delegate.reactiveGet( entityClass, ids ); + } + @Override public CompletionStage get(Class entityClass, Object id, LockMode lockMode) { return delegate.reactiveGet( entityClass, id, lockMode, null ); diff --git a/hibernate-reactive-core/src/test/java/org/hibernate/reactive/MutinyStatelessSessionTest.java b/hibernate-reactive-core/src/test/java/org/hibernate/reactive/MutinyStatelessSessionTest.java new file mode 100644 index 000000000..cde496e57 --- /dev/null +++ b/hibernate-reactive-core/src/test/java/org/hibernate/reactive/MutinyStatelessSessionTest.java @@ -0,0 +1,271 @@ +/* Hibernate, Relational Persistence for Idiomatic Java + * + * SPDX-License-Identifier: Apache-2.0 + * Copyright: Red Hat Inc. and Hibernate Authors + */ +package org.hibernate.reactive; + +import io.vertx.junit5.Timeout; +import io.vertx.junit5.VertxTestContext; +import jakarta.persistence.*; +import jakarta.persistence.criteria.*; +import org.junit.jupiter.api.Test; + +import java.util.Collection; +import java.util.List; +import java.util.Objects; + +import static java.util.concurrent.TimeUnit.MINUTES; +import static org.junit.jupiter.api.Assertions.*; + +@Timeout(value = 10, timeUnit = MINUTES) + +public class MutinyStatelessSessionTest extends BaseReactiveTest { + + @Override + protected Collection> annotatedEntities() { + return List.of( GuineaPig.class ); + } + + @Test + public void testStatelessSession(VertxTestContext context) { + GuineaPig pig = new GuineaPig( "Aloi" ); + test( context, getMutinySessionFactory().withStatelessSession( ss -> ss + .insert( pig ) + .chain( v -> ss.createSelectionQuery( "from GuineaPig where name=:n", GuineaPig.class ) + .setParameter( "n", pig.name ) + .getResultList() ) + .invoke( list -> { + assertFalse( list.isEmpty() ); + assertEquals( 1, list.size() ); + assertThatPigsAreEqual( pig, list.get( 0 ) ); + } ) + .chain( v -> ss.get( GuineaPig.class, pig.id ) ) + .chain( p -> { + assertThatPigsAreEqual( pig, p ); + p.name = "X"; + return ss.update( p ); + } ) + .chain( v -> ss.refresh( pig ) ) + .invoke( v -> assertEquals( pig.name, "X" ) ) + .chain( v -> ss.createMutationQuery( "update GuineaPig set name='Y'" ).executeUpdate() ) + .chain( v -> ss.refresh( pig ) ) + .invoke( v -> assertEquals( pig.name, "Y" ) ) + .chain( v -> ss.delete( pig ) ) + .chain( v -> ss.createSelectionQuery( "from GuineaPig", GuineaPig.class ).getResultList() ) + .invoke( list -> assertTrue( list.isEmpty() ) ) ) + ); + } + + @Test + public void testStatelessSessionWithNamed(VertxTestContext context) { + GuineaPig pig = new GuineaPig( "Aloi" ); + test( context, getMutinySessionFactory().withStatelessSession( ss -> ss + .insert( pig ) + .chain( v -> ss.createNamedQuery( "findbyname", GuineaPig.class ) + .setParameter( "n", pig.name ) + .getResultList() ) + .invoke( list -> { + assertFalse( list.isEmpty() ); + assertEquals( 1, list.size() ); + assertThatPigsAreEqual( pig, list.get( 0 ) ); + } ) + .chain( v -> ss.get( GuineaPig.class, pig.id ) ) + .chain( p -> { + assertThatPigsAreEqual( pig, p ); + p.name = "X"; + return ss.update( p ); + } ) + .chain( v -> ss.refresh( pig ) ) + .invoke( v -> assertEquals( pig.name, "X" ) ) + .chain( v -> ss.createNamedQuery( "updatebyname" ).executeUpdate() ) + .chain( v -> ss.refresh( pig ) ) + .invoke( v -> assertEquals( pig.name, "Y" ) ) + .chain( v -> ss.delete( pig ) ) + .chain( v -> ss.createNamedQuery( "findall" ).getResultList() ) + .invoke( list -> assertTrue( list.isEmpty() ) ) ) + ); + } + + @Test + public void testStatelessSessionWithNative(VertxTestContext context) { + GuineaPig pig = new GuineaPig( "Aloi" ); + test( context, getMutinySessionFactory().openStatelessSession() + .chain( ss -> ss.insert( pig ) + .chain( v -> ss + .createNativeQuery( "select * from Piggy where name=:n", GuineaPig.class ) + .setParameter( "n", pig.name ) + .getResultList() ) + .invoke( list -> { + assertFalse( list.isEmpty() ); + assertEquals( 1, list.size() ); + assertThatPigsAreEqual( pig, list.get( 0 ) ); + } ) + .chain( v -> ss.get( GuineaPig.class, pig.id ) ) + .chain( p -> { + assertThatPigsAreEqual( pig, p ); + p.name = "X"; + return ss.update( p ); + } ) + .chain( v -> ss.refresh( pig ) ) + .invoke( v -> assertEquals( pig.name, "X" ) ) + .chain( v -> ss.createNativeQuery( "update Piggy set name='Y'" ) + .executeUpdate() ) + .invoke( rows -> assertEquals( 1, rows ) ) + .chain( v -> ss.refresh( pig ) ) + .invoke( v -> assertEquals( pig.name, "Y" ) ) + .chain( v -> ss.delete( pig ) ) + .chain( v -> ss.createNativeQuery( "select id from Piggy" ).getResultList() ) + .invoke( list -> assertTrue( list.isEmpty() ) ) + .chain( v -> ss.close() ) ) + ); + } + + @Test + public void testStatelessSessionGetMultiple(VertxTestContext context) { + GuineaPig a = new GuineaPig("A"); + GuineaPig b = new GuineaPig("B"); + GuineaPig c = new GuineaPig("C"); + test( context, getMutinySessionFactory().openStatelessSession() + .chain( ss -> ss.insertMultiple( List.of(a, b, c) ) + .chain( v -> ss.get( GuineaPig.class, a.id, c.id ) ) + .invoke( list -> { + assertEquals( 2, list.size() ); + assertThatPigsAreEqual( a, list.get( 0 ) ); + assertThatPigsAreEqual( c, list.get( 1 ) ); + }) + .chain( v -> ss.close() ) ) + ); + } + + @Test + public void testStatelessSessionCriteria(VertxTestContext context) { + GuineaPig pig = new GuineaPig( "Aloi" ); + + CriteriaBuilder cb = getSessionFactory().getCriteriaBuilder(); + + CriteriaQuery query = cb.createQuery( GuineaPig.class ); + Root gp = query.from( GuineaPig.class ); + query.where( cb.equal( gp.get( "name" ), cb.parameter( String.class, "n" ) ) ); + + CriteriaUpdate update = cb.createCriteriaUpdate( GuineaPig.class ); + update.from( GuineaPig.class ); + update.set( "name", "Bob" ); + + CriteriaDelete delete = cb.createCriteriaDelete( GuineaPig.class ); + delete.from( GuineaPig.class ); + + test( context, getMutinySessionFactory().openStatelessSession() + .chain( ss -> ss.insert( pig ) + .chain( v -> ss.createQuery( query ) + .setParameter( "n", pig.name ) + .getResultList() ) + .invoke( list -> { + assertFalse( list.isEmpty() ); + assertEquals( 1, list.size() ); + assertThatPigsAreEqual( pig, list.get( 0 ) ); + } ) + .chain( v -> ss.createQuery( update ).executeUpdate() ) + .invoke( rows -> assertEquals( 1, rows ) ) + .chain( v -> ss.createQuery( delete ).executeUpdate() ) + .invoke( rows -> assertEquals( 1, rows ) ) + .chain( v -> ss.close() ) ) + ); + } + + @Test + public void testTransactionPropagation(VertxTestContext context) { + test( context, getMutinySessionFactory().withStatelessSession( + session -> session.withTransaction( transaction -> session.createSelectionQuery( "from GuineaPig", GuineaPig.class ) + .getResultList() + .chain( list -> { + assertNotNull( session.currentTransaction() ); + assertFalse( session.currentTransaction().isMarkedForRollback() ); + session.currentTransaction().markForRollback(); + assertTrue( session.currentTransaction().isMarkedForRollback() ); + assertTrue( transaction.isMarkedForRollback() ); + return session.withTransaction( t -> { + assertTrue( t.isMarkedForRollback() ); + return session.createSelectionQuery( "from GuineaPig", GuineaPig.class ).getResultList(); + } ); + } ) ) + ) ); + } + + @Test + public void testSessionPropagation(VertxTestContext context) { + test( context, getMutinySessionFactory().withStatelessSession( + session -> session.createSelectionQuery( "from GuineaPig", GuineaPig.class ).getResultList() + .chain( list -> getMutinySessionFactory().withStatelessSession( s -> { + assertEquals( session, s ); + return s.createSelectionQuery( "from GuineaPig", GuineaPig.class ).getResultList(); + } ) ) + ) ); + } + + private void assertThatPigsAreEqual( GuineaPig expected, GuineaPig actual) { + assertNotNull( actual ); + assertEquals( expected.getId(), actual.getId() ); + assertEquals( expected.getName(), actual.getName() ); + } + + @NamedQuery(name = "findbyname", query = "from GuineaPig where name=:n") + @NamedQuery(name = "updatebyname", query = "update GuineaPig set name='Y'") + @NamedQuery(name = "findall", query = "from GuineaPig") + + @Entity(name = "GuineaPig") + @Table(name = "Piggy") + public static class GuineaPig { + @Id + @GeneratedValue + private Integer id; + private String name; + @Version + private int version; + + public GuineaPig() { + } + + public GuineaPig(String name) { + this.name = name; + } + + public Integer getId() { + return id; + } + + public void setId(Integer id) { + this.id = id; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + @Override + public String toString() { + return id + ": " + name; + } + + @Override + public boolean equals(Object o) { + if ( this == o ) { + return true; + } + if ( o == null || getClass() != o.getClass() ) { + return false; + } + GuineaPig guineaPig = (GuineaPig) o; + return Objects.equals( name, guineaPig.name ); + } + + @Override + public int hashCode() { + return Objects.hash( name ); + } + } +} diff --git a/hibernate-reactive-core/src/test/java/org/hibernate/reactive/ReactiveStatelessSessionTest.java b/hibernate-reactive-core/src/test/java/org/hibernate/reactive/ReactiveStatelessSessionTest.java index c2f6ac31b..b4d2cbf1f 100644 --- a/hibernate-reactive-core/src/test/java/org/hibernate/reactive/ReactiveStatelessSessionTest.java +++ b/hibernate-reactive-core/src/test/java/org/hibernate/reactive/ReactiveStatelessSessionTest.java @@ -135,6 +135,23 @@ public void testStatelessSessionWithNative(VertxTestContext context) { ); } + @Test + public void testStatelessSessionGetMultiple(VertxTestContext context) { + GuineaPig a = new GuineaPig("A"); + GuineaPig b = new GuineaPig("B"); + GuineaPig c = new GuineaPig("C"); + test( context, getSessionFactory().openStatelessSession() + .thenCompose( ss -> ss.insertMultiple( List.of(a, b, c) ) + .thenCompose( v -> ss.get( GuineaPig.class, a.id, c.id ) ) + .thenAccept( list -> { + assertEquals( 2, list.size() ); + assertThatPigsAreEqual( a, list.get( 0 ) ); + assertThatPigsAreEqual( c, list.get( 1 ) ); + }) + .thenCompose( v -> ss.close() ) ) + ); + } + @Test public void testStatelessSessionCriteria(VertxTestContext context) { GuineaPig pig = new GuineaPig( "Aloi" ); From 2f8c6e08ea44bd129406b41f72d7108bc04d8b22 Mon Sep 17 00:00:00 2001 From: Gavin King Date: Mon, 17 Feb 2025 14:57:07 +0100 Subject: [PATCH 2/3] fix code which was not passing the LockMode --- .../reactive/session/impl/ReactiveStatelessSessionImpl.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/hibernate-reactive-core/src/main/java/org/hibernate/reactive/session/impl/ReactiveStatelessSessionImpl.java b/hibernate-reactive-core/src/main/java/org/hibernate/reactive/session/impl/ReactiveStatelessSessionImpl.java index 7ca780e40..ac64223a8 100644 --- a/hibernate-reactive-core/src/main/java/org/hibernate/reactive/session/impl/ReactiveStatelessSessionImpl.java +++ b/hibernate-reactive-core/src/main/java/org/hibernate/reactive/session/impl/ReactiveStatelessSessionImpl.java @@ -248,7 +248,7 @@ public CompletionStage reactiveGet(String entityName, Object id) { @Override public CompletionStage reactiveGet(Class entityClass, Object id, LockMode lockMode, EntityGraph fetchGraph) { - return reactiveGet( entityClass.getName(), id, LockMode.NONE, fetchGraph ); + return reactiveGet( entityClass.getName(), id, lockMode, fetchGraph ); } @Override @@ -443,7 +443,7 @@ public CompletionStage reactiveRefresh(String entityName, Object entity) { @Override public CompletionStage reactiveRefresh(Object entity, LockMode lockMode) { - return reactiveRefresh( bestGuessEntityName( entity ), entity, LockMode.NONE ); + return reactiveRefresh( bestGuessEntityName( entity ), entity, lockMode ); } @Override From 5af3fc993b08a9f79f93d326527b0aae96a08cdc Mon Sep 17 00:00:00 2001 From: Gavin King Date: Mon, 17 Feb 2025 14:57:24 +0100 Subject: [PATCH 3/3] squash some warnings --- .../session/impl/ReactiveSessionImpl.java | 31 ++++++++-------- .../impl/ReactiveStatelessSessionImpl.java | 35 +++++++++---------- 2 files changed, 30 insertions(+), 36 deletions(-) diff --git a/hibernate-reactive-core/src/main/java/org/hibernate/reactive/session/impl/ReactiveSessionImpl.java b/hibernate-reactive-core/src/main/java/org/hibernate/reactive/session/impl/ReactiveSessionImpl.java index fb20deaaf..9f5ca8c95 100644 --- a/hibernate-reactive-core/src/main/java/org/hibernate/reactive/session/impl/ReactiveSessionImpl.java +++ b/hibernate-reactive-core/src/main/java/org/hibernate/reactive/session/impl/ReactiveSessionImpl.java @@ -273,8 +273,8 @@ public CompletionStage reactiveFetch(T association, boolean unproxy) { return nullFuture(); } - if ( association instanceof HibernateProxy ) { - LazyInitializer initializer = ( (HibernateProxy) association ).getHibernateLazyInitializer(); + if ( association instanceof HibernateProxy proxy ) { + LazyInitializer initializer = proxy.getHibernateLazyInitializer(); if ( !initializer.isUninitialized() ) { return completedFuture( unproxy ? (T) initializer.getImplementation() : association ); } @@ -290,13 +290,12 @@ public CompletionStage reactiveFetch(T association, boolean unproxy) { } ); } } - else if ( association instanceof PersistentCollection ) { - final PersistentCollection persistentCollection = (PersistentCollection) association; - if ( persistentCollection.wasInitialized() ) { + else if (association instanceof PersistentCollection collection) { + if ( collection.wasInitialized() ) { return completedFuture( association ); } else { - return reactiveInitializeCollection( persistentCollection, false ) + return reactiveInitializeCollection( collection, false ) // don't reassociate the collection instance, because // its owner isn't associated with this session .thenApply( v -> association ); @@ -305,9 +304,8 @@ else if ( association instanceof PersistentCollection ) { else if ( isPersistentAttributeInterceptable( association ) ) { final PersistentAttributeInterceptable interceptable = asPersistentAttributeInterceptable( association ); final PersistentAttributeInterceptor interceptor = interceptable.$$_hibernate_getInterceptor(); - if ( interceptor instanceof EnhancementAsProxyLazinessInterceptor ) { - EnhancementAsProxyLazinessInterceptor eapli = (EnhancementAsProxyLazinessInterceptor) interceptor; - return forceInitialize( association, null, eapli.getIdentifier(), eapli.getEntityName(), this ) + if ( interceptor instanceof EnhancementAsProxyLazinessInterceptor lazinessInterceptor ) { + return forceInitialize( association, null, lazinessInterceptor.getIdentifier(), lazinessInterceptor.getEntityName(), this ) .thenApply( i -> association ); } @@ -369,7 +367,7 @@ public ReactiveQuery createReactiveQuery(String queryString, Class exp delayedAfterCompletion(); try { - final HqlInterpretation interpretation = interpretHql( queryString, expectedResultType ); + final HqlInterpretation interpretation = interpretHql( queryString, expectedResultType ); final ReactiveQuerySqmImpl query = new ReactiveQuerySqmImpl<>( queryString, interpretation, expectedResultType, this ); applyQuerySettingsAndHints( query ); @@ -482,7 +480,7 @@ private ReactiveSelectionQuery interpretAndCreateSelectionQuery(String hq delayedAfterCompletion(); try { - final HqlInterpretation interpretation = interpretHql( hql, resultType ); + final HqlInterpretation interpretation = interpretHql( hql, resultType ); checkSelectionQuery( hql, interpretation ); return createSelectionQuery( hql, resultType, interpretation ); } @@ -492,7 +490,7 @@ private ReactiveSelectionQuery interpretAndCreateSelectionQuery(String hq } } - private ReactiveSelectionQuery createSelectionQuery(String hql, Class resultType, HqlInterpretation interpretation) { + private ReactiveSelectionQuery createSelectionQuery(String hql, Class resultType, HqlInterpretation interpretation) { final ReactiveSqmSelectionQueryImpl query = new ReactiveSqmSelectionQueryImpl<>( hql, interpretation, resultType, this ); if ( resultType != null ) { @@ -1671,9 +1669,8 @@ public void setBatchSize(Integer batchSize) { @Override @SuppressWarnings("unchecked") public Class getEntityClass(T entity) { - if ( entity instanceof HibernateProxy ) { - return (Class) ( (HibernateProxy) entity ) - .getHibernateLazyInitializer() + if ( entity instanceof HibernateProxy proxy ) { + return (Class) proxy.getHibernateLazyInitializer() .getPersistentClass(); } else { @@ -1684,8 +1681,8 @@ public Class getEntityClass(T entity) { @Override public Object getEntityId(Object entity) { - if ( entity instanceof HibernateProxy ) { - return ( (HibernateProxy) entity ).getHibernateLazyInitializer() + if ( entity instanceof HibernateProxy proxy ) { + return proxy.getHibernateLazyInitializer() .getIdentifier(); } else { diff --git a/hibernate-reactive-core/src/main/java/org/hibernate/reactive/session/impl/ReactiveStatelessSessionImpl.java b/hibernate-reactive-core/src/main/java/org/hibernate/reactive/session/impl/ReactiveStatelessSessionImpl.java index ac64223a8..bc588dae8 100644 --- a/hibernate-reactive-core/src/main/java/org/hibernate/reactive/session/impl/ReactiveStatelessSessionImpl.java +++ b/hibernate-reactive-core/src/main/java/org/hibernate/reactive/session/impl/ReactiveStatelessSessionImpl.java @@ -397,8 +397,8 @@ public CompletionStage reactiveDelete(Object entity) { @Override public CompletionStage reactiveUpdate(Object entity) { checkOpen(); - if ( entity instanceof HibernateProxy ) { - final LazyInitializer hibernateLazyInitializer = ( (HibernateProxy) entity ).getHibernateLazyInitializer(); + if ( entity instanceof HibernateProxy proxy ) { + final LazyInitializer hibernateLazyInitializer = proxy.getHibernateLazyInitializer(); return hibernateLazyInitializer.isUninitialized() ? failedFuture( LOG.uninitializedProxyUpdate( entity.getClass() ) ) : executeReactiveUpdate( hibernateLazyInitializer.getImplementation() ); @@ -730,22 +730,21 @@ public CompletionStage reactiveFetch(T association, boolean unproxy) { return completedFuture( unproxy ? (T) initializer.getImplementation() : association ); } } - else if ( association instanceof PersistentCollection ) { - final PersistentCollection persistentCollection = (PersistentCollection) association; - if ( persistentCollection.wasInitialized() ) { + else if ( association instanceof PersistentCollection collection ) { + if ( collection.wasInitialized() ) { return completedFuture( association ); } else { final ReactiveCollectionPersister collectionDescriptor = (ReactiveCollectionPersister) getFactory().getMappingMetamodel() - .getCollectionDescriptor( persistentCollection.getRole() ); + .getCollectionDescriptor( collection.getRole() ); - final Object key = persistentCollection.getKey(); - persistenceContext.addUninitializedCollection( collectionDescriptor, persistentCollection, key ); - persistentCollection.setCurrentSession( this ); + final Object key = collection.getKey(); + persistenceContext.addUninitializedCollection( collectionDescriptor, collection, key ); + collection.setCurrentSession( this ); return collectionDescriptor.reactiveInitialize( key, this ) .whenComplete( (v, e) -> { - persistentCollection.unsetSession( this ); + collection.unsetSession( this ); if ( persistenceContext.isLoadFinished() ) { persistenceContext.clear(); } @@ -756,13 +755,11 @@ else if ( association instanceof PersistentCollection ) { else if ( isPersistentAttributeInterceptable( association ) ) { final PersistentAttributeInterceptable interceptable = asPersistentAttributeInterceptable( association ); final PersistentAttributeInterceptor interceptor = interceptable.$$_hibernate_getInterceptor(); - if ( interceptor instanceof EnhancementAsProxyLazinessInterceptor ) { - final EnhancementAsProxyLazinessInterceptor proxyInterceptor = - (EnhancementAsProxyLazinessInterceptor) interceptor; - proxyInterceptor.setSession( this ); - return forceInitialize( association, null, proxyInterceptor.getIdentifier(), proxyInterceptor.getEntityName(), this ) + if ( interceptor instanceof EnhancementAsProxyLazinessInterceptor lazinessInterceptor ) { + lazinessInterceptor.setSession( this ); + return forceInitialize( association, null, lazinessInterceptor.getIdentifier(), lazinessInterceptor.getEntityName(), this ) .whenComplete( (i,e) -> { - proxyInterceptor.unsetSession(); + lazinessInterceptor.unsetSession(); if ( persistenceContext.isLoadFinished() ) { persistenceContext.clear(); } @@ -860,7 +857,7 @@ public ReactiveSqmQueryImplementor createReactiveQuery(String queryString delayedAfterCompletion(); try { - final HqlInterpretation interpretation = interpretHql( queryString, expectedResultType ); + final HqlInterpretation interpretation = interpretHql( queryString, expectedResultType ); final ReactiveQuerySqmImpl query = new ReactiveQuerySqmImpl<>( queryString, interpretation, expectedResultType, this ); applyQuerySettingsAndHints( query ); @@ -973,7 +970,7 @@ private ReactiveSelectionQuery interpretAndCreateSelectionQuery(String hq delayedAfterCompletion(); try { - final HqlInterpretation interpretation = interpretHql( hql, resultType ); + final HqlInterpretation interpretation = interpretHql( hql, resultType ); checkSelectionQuery( hql, interpretation ); return createSelectionQuery( hql, resultType, interpretation ); } @@ -983,7 +980,7 @@ private ReactiveSelectionQuery interpretAndCreateSelectionQuery(String hq } } - private ReactiveSelectionQuery createSelectionQuery(String hql, Class resultType, HqlInterpretation interpretation) { + private ReactiveSelectionQuery createSelectionQuery(String hql, Class resultType, HqlInterpretation interpretation) { final ReactiveSqmSelectionQueryImpl query = new ReactiveSqmSelectionQueryImpl<>( hql, interpretation, resultType, this ); if ( resultType != null ) {