Skip to content

Shared session contract #2130

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Draft
wants to merge 2 commits into
base: main
Choose a base branch
from
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
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);

Check notice

Code scanning / CodeQL

Missing Override annotation Note

This method overrides
ReactiveQueryProducer.reactiveFetch
; it is advisable to add an Override annotation.

<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
Loading
Loading