Skip to content

Commit

Permalink
[hibernate#2104] Create Mutiny.SharedSessionContract interface
Browse files Browse the repository at this point in the history
  • Loading branch information
DavideD committed Feb 20, 2025
1 parent c8bc1f6 commit df1f137
Show file tree
Hide file tree
Showing 7 changed files with 750 additions and 895 deletions.
1,390 changes: 591 additions & 799 deletions hibernate-reactive-core/src/main/java/org/hibernate/reactive/mutiny/Mutiny.java

Large diffs are not rendered by default.

Original file line number Diff line number Diff line change
Expand Up @@ -84,6 +84,11 @@ public <E, T> Uni<T> fetch(E entity, Attribute<E, T> field) {
return uni( () -> delegate.reactiveFetch( entity, field ) );
}

@Override
public Object getIdentifier(Object entity) {
return delegate.getIdentifier( entity );
}

@Override
public <T> Uni<T> unproxy(T association) {
return uni( () -> delegate.reactiveFetch( association, true ) );
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -5,25 +5,28 @@
*/
package org.hibernate.reactive.mutiny.impl;

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 java.util.List;
import java.util.concurrent.CompletableFuture;
import java.util.concurrent.CompletionStage;
import java.util.function.Function;
import java.util.function.Supplier;

import org.hibernate.Filter;
import org.hibernate.LockMode;
import org.hibernate.graph.spi.RootGraphImplementor;
import org.hibernate.query.criteria.JpaCriteriaInsert;
import org.hibernate.reactive.common.AffectedEntities;
import org.hibernate.reactive.common.ResultSetMapping;
import org.hibernate.reactive.mutiny.Mutiny;
import org.hibernate.reactive.mutiny.Mutiny.Query;
import org.hibernate.reactive.mutiny.Mutiny.SelectionQuery;
import org.hibernate.reactive.pool.ReactiveConnection;
import org.hibernate.reactive.session.ReactiveStatelessSession;

import java.util.List;
import java.util.concurrent.CompletableFuture;
import java.util.concurrent.CompletionStage;
import java.util.function.Function;
import java.util.function.Supplier;
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 jakarta.persistence.metamodel.Attribute;


/**
Expand All @@ -45,7 +48,6 @@ public ReactiveConnection getReactiveConnection() {
return delegate.getReactiveConnection();
}


<T> Uni<T> uni(Supplier<CompletionStage<T>> stageSupplier) {
return factory.uni( stageSupplier );
}
Expand All @@ -71,66 +73,6 @@ public <T> Uni<T> get(EntityGraph<T> entityGraph, Object id) {
return uni( () -> delegate.reactiveGet( entityClass, id, null, entityGraph ) );
}

@Override
public <R> Query<R> createQuery(String queryString) {
return new MutinyQueryImpl<>( delegate.createReactiveQuery( queryString ), factory );
}

@Override @Deprecated
public <R> SelectionQuery<R> createQuery(String queryString, Class<R> resultType) {
return new MutinySelectionQueryImpl<>( delegate.createReactiveQuery( queryString, resultType ), factory );
}

@Override
public <R> SelectionQuery<R> createSelectionQuery(String queryString, Class<R> resultType) {
return new MutinySelectionQueryImpl<>( delegate.createReactiveSelectionQuery( queryString, resultType), factory );
}

@Override
public Mutiny.MutationQuery createMutationQuery(String queryString) {
return new MutinyMutationQueryImpl<>( delegate.createReactiveMutationQuery( queryString), factory );
}

@Override
public <R> Query<R> createNamedQuery(String queryName) {
return new MutinyQueryImpl<>( delegate.createReactiveNamedQuery( queryName, null ), factory );
}

@Override
public <R> SelectionQuery<R> createNamedQuery(String queryName, Class<R> resultType) {
return new MutinySelectionQueryImpl<>( delegate.createReactiveNamedQuery( queryName, resultType ), factory );
}

@Override
public <R> Query<R> createNativeQuery(String queryString) {
return new MutinyQueryImpl<>( delegate.createReactiveNativeQuery( queryString ), factory );
}

@Override
public <R> SelectionQuery<R> createNativeQuery(String queryString, Class<R> resultType) {
return new MutinySelectionQueryImpl<>( delegate.createReactiveNativeQuery( queryString, resultType ), factory );
}

@Override
public <R> SelectionQuery<R> createNativeQuery(String queryString, ResultSetMapping<R> resultSetMapping) {
return new MutinySelectionQueryImpl<>( delegate.createReactiveNativeQuery( queryString, resultSetMapping ), factory );
}

@Override
public <R> SelectionQuery<R> createQuery(CriteriaQuery<R> criteriaQuery) {
return new MutinySelectionQueryImpl<>( delegate.createReactiveQuery( criteriaQuery ), factory );
}

@Override
public <R> Mutiny.MutationQuery createQuery(CriteriaUpdate<R> criteriaUpdate) {
return new MutinyMutationQueryImpl<>( delegate.createReactiveMutationQuery( criteriaUpdate ), factory );
}

@Override
public <R> Mutiny.MutationQuery createQuery(CriteriaDelete<R> criteriaDelete) {
return new MutinyMutationQueryImpl<>( delegate.createReactiveMutationQuery( criteriaDelete ), factory );
}

@Override
public Uni<Void> insert(Object entity) {
return uni( () -> delegate.reactiveInsert( entity ) );
Expand Down Expand Up @@ -226,36 +168,117 @@ public Uni<Void> refresh(Object entity, LockMode lockMode) {
return uni( () -> delegate.reactiveRefresh( entity, lockMode ) );
}

@Override
public <R> Mutiny.SelectionQuery<R> createSelectionQuery(String queryString, Class<R> resultType) {
return new MutinySelectionQueryImpl<>( delegate.createReactiveSelectionQuery( queryString, resultType ), factory );
}

@Override
public Mutiny.MutationQuery createMutationQuery(String queryString) {
return new MutinyMutationQueryImpl<>( delegate.createReactiveQuery( queryString ), factory );
}

@Override
public Mutiny.MutationQuery createMutationQuery(CriteriaUpdate<?> updateQuery) {
return new MutinyMutationQueryImpl<>( delegate.createReactiveMutationQuery( updateQuery ), factory );
}

@Override
public Mutiny.MutationQuery createMutationQuery(CriteriaDelete<?> deleteQuery) {
return new MutinyMutationQueryImpl<>( delegate.createReactiveMutationQuery( deleteQuery ), factory );
}

@Override
public Mutiny.MutationQuery createMutationQuery(JpaCriteriaInsert<?> insert) {
return new MutinyMutationQueryImpl<>( delegate.createReactiveMutationQuery( insert ), factory );
}

@Override @Deprecated
public <R> Mutiny.Query<R> createQuery(String queryString) {
return new MutinyQueryImpl<>( delegate.createReactiveQuery( queryString ), factory );
}

@Override
public <R> Mutiny.SelectionQuery<R> createQuery(String queryString, Class<R> resultType) {
return new MutinySelectionQueryImpl<>( delegate.createReactiveQuery( queryString, resultType ), factory );
}

@Override
public <R> Mutiny.SelectionQuery<R> createQuery(CriteriaQuery<R> criteriaQuery) {
return new MutinySelectionQueryImpl<>( delegate.createReactiveQuery( criteriaQuery ), factory );
}

@Override
public <R> Mutiny.MutationQuery createQuery(CriteriaUpdate<R> criteriaUpdate) {
return new MutinyMutationQueryImpl<>(
delegate.createReactiveMutationQuery( criteriaUpdate ),
factory
);
}

@Override
public <R> Mutiny.MutationQuery createQuery(CriteriaDelete<R> criteriaDelete) {
return new MutinyMutationQueryImpl<>(
delegate.createReactiveMutationQuery( criteriaDelete ),
factory
);
}

@Override
public <R> Mutiny.Query<R> createNamedQuery(String queryName) {
return new MutinyQueryImpl<>( delegate.createReactiveNamedQuery( queryName, null ), factory );
}

@Override
public <R> Mutiny.SelectionQuery<R> createNamedQuery(String queryName, Class<R> resultType) {
return new MutinySelectionQueryImpl<>( delegate.createReactiveNamedQuery( queryName, resultType ), factory );
}

@Override
public <R> Mutiny.Query<R> createNativeQuery(String queryString) {
return new MutinyQueryImpl<>( delegate.createReactiveNativeQuery( queryString ), factory );
}

@Override
public <R> Mutiny.Query<R> createNativeQuery(String queryString, AffectedEntities affectedEntities) {
return new MutinyQueryImpl<>( delegate.createReactiveNativeQuery( queryString, affectedEntities ), factory );
}

@Override
public <R> Mutiny.SelectionQuery<R> createNativeQuery(String queryString, Class<R> resultType) {
return new MutinySelectionQueryImpl<>( delegate.createReactiveNativeQuery( queryString, resultType ), factory );
}

@Override
public <R> Mutiny.SelectionQuery<R> createNativeQuery(String queryString, Class<R> resultType, AffectedEntities affectedEntities) {
return new MutinySelectionQueryImpl<>( delegate.createReactiveNativeQuery( queryString, resultType, affectedEntities ), factory );
}

@Override
public <R> Mutiny.SelectionQuery<R> createNativeQuery(String queryString, ResultSetMapping<R> resultSetMapping) {
return new MutinySelectionQueryImpl<>( delegate.createReactiveNativeQuery( queryString, resultSetMapping ), factory );
}

@Override
public <R> Mutiny.SelectionQuery<R> createNativeQuery(String queryString, ResultSetMapping<R> resultSetMapping, AffectedEntities affectedEntities) {
return new MutinySelectionQueryImpl<>( delegate.createReactiveNativeQuery( queryString, resultSetMapping, affectedEntities ), factory );
}

@Override
public <T> Uni<T> fetch(T association) {
return uni( () -> delegate.reactiveFetch( association, false ) );
}

@Override
public <E, T> Uni<T> fetch(E entity, Attribute<E, T> field) {
return uni( () -> delegate.reactiveFetch( entity, field ) );
}

@Override
public Object getIdentifier(Object entity) {
return delegate.getIdentifier(entity);
}

// @Override
// public <T> ResultSetMapping<T> getResultSetMapping(Class<T> resultType, String mappingName) {
// return delegate.getResultSetMapping( resultType, mappingName );
// }
//
// @Override
// public <T> EntityGraph<T> getEntityGraph(Class<T> entity, String name) {
// return delegate.getEntityGraph( entity, name );
// }
//
// @Override
// public <T> EntityGraph<T> createEntityGraph(Class<T> entity) {
// return delegate.createEntityGraph( entity );
// }
//
// @Override
// public <T> EntityGraph<T> createEntityGraph(Class<T> entity, String name) {
// return delegate.createEntityGraph( entity, name );
// }

@Override
public <T> Uni<T> withTransaction(Function<Mutiny.Transaction, Uni<T>> work) {
return currentTransaction == null ? new Transaction<T>().execute( work ) : work.apply( currentTransaction );
Expand Down Expand Up @@ -336,6 +359,26 @@ public MutinySessionFactoryImpl getFactory() {
return factory;
}

@Override
public boolean isFetchProfileEnabled(String name) {
return false;
}

@Override
public Filter enableFilter(String filterName) {
return delegate.getSharedContract().enableFilter( filterName );
}

@Override
public void disableFilter(String filterName) {
delegate.getSharedContract().disableFilter( filterName );
}

@Override
public Filter getEnabledFilter(String filterName) {
return delegate.getSharedContract().getEnabledFilter( filterName );
}

@Override
public <T> ResultSetMapping<T> getResultSetMapping(Class<T> resultType, String mappingName) {
return delegate.getResultSetMapping( resultType, mappingName );
Expand All @@ -355,4 +398,9 @@ public <T> EntityGraph<T> createEntityGraph(Class<T> rootType) {
public <T> EntityGraph<T> createEntityGraph(Class<T> rootType, String graphName) {
return delegate.createEntityGraph( rootType, graphName );
}

@Override
public <T> Uni<T> unproxy(T association) {
return uni( () -> delegate.reactiveFetch( association, true ) );
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,7 @@
import jakarta.persistence.criteria.CriteriaDelete;
import jakarta.persistence.criteria.CriteriaQuery;
import jakarta.persistence.criteria.CriteriaUpdate;
import jakarta.persistence.metamodel.Attribute;


/**
Expand All @@ -43,6 +44,8 @@ public interface ReactiveQueryProducer extends ReactiveConnectionSupplier {

<T> CompletionStage<T> reactiveFetch(T association, boolean unproxy);

<E,T> CompletionStage<T> reactiveFetch(E entity, Attribute<E,T> field);

CompletionStage<Object> reactiveInternalLoad(String entityName, Object id, boolean eager, boolean nullable);

<T> EntityGraph<T> createEntityGraph(Class<T> entity);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -27,7 +27,6 @@
import org.hibernate.reactive.engine.spi.ReactiveSharedSessionContractImplementor;

import jakarta.persistence.EntityGraph;
import jakarta.persistence.metamodel.Attribute;

/**
* A contract with the Hibernate session backing the user-visible
Expand All @@ -46,8 +45,6 @@ public interface ReactiveSession extends ReactiveQueryProducer, ReactiveSharedSe

SessionImplementor getSharedContract();

<E,T> CompletionStage<T> reactiveFetch(E entity, Attribute<E,T> field);

CompletionStage<Void> reactivePersist(Object entity);

CompletionStage<Void> reactivePersist(String entityName, Object object);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@
import org.hibernate.reactive.engine.spi.ReactiveSharedSessionContractImplementor;

import jakarta.persistence.EntityGraph;
import jakarta.persistence.metamodel.Attribute;

import java.util.List;
import java.util.concurrent.CompletableFuture;
Expand All @@ -28,6 +29,8 @@
@Incubating
public interface ReactiveStatelessSession extends ReactiveQueryProducer, ReactiveSharedSessionContractImplementor {

<E,T> CompletionStage<T> reactiveFetch(E entity, Attribute<E,T> field);

<T> CompletionStage<T> reactiveGet(Class<T> entityClass, Object id);

<T> CompletionStage<List<T>> reactiveGet(Class<T> entityClass, Object... id);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -90,6 +90,7 @@
import jakarta.persistence.criteria.CriteriaDelete;
import jakarta.persistence.criteria.CriteriaQuery;
import jakarta.persistence.criteria.CriteriaUpdate;
import jakarta.persistence.metamodel.Attribute;

import static java.lang.Boolean.TRUE;
import static java.lang.invoke.MethodHandles.lookup;
Expand Down Expand Up @@ -689,6 +690,12 @@ else if ( !persister.hasSubclasses() ) {
.whenComplete( (r, e) -> persistenceContext.afterLoad() );
}

@Override
public <E, T> CompletionStage<T> reactiveFetch(E entity, Attribute<E, T> field) {
return getEntityPersister( null, entity )
.reactiveInitializeLazyProperty( field, entity, this );
}

@Override
@SuppressWarnings("unchecked")
public <T> CompletionStage<T> reactiveFetch(T association, boolean unproxy) {
Expand Down

0 comments on commit df1f137

Please sign in to comment.