From af7e7b9afca3b86f6367e7839be897ae01906a9e Mon Sep 17 00:00:00 2001 From: Gavin King Date: Thu, 13 Jul 2023 16:19:44 +0200 Subject: [PATCH] make it possible to get a named EntityGraph without an unchecked typecast --- .../org/hibernate/SharedSessionContract.java | 19 +++++++++++++++++++ .../engine/spi/SessionDelegatorBaseImpl.java | 6 ++++++ .../engine/spi/SessionLazyDelegator.java | 5 +++++ .../spi/SharedSessionDelegatorBaseImpl.java | 5 +++++ .../AbstractSharedSessionContract.java | 19 +++++++++++++++++++ 5 files changed, 54 insertions(+) diff --git a/hibernate-core/src/main/java/org/hibernate/SharedSessionContract.java b/hibernate-core/src/main/java/org/hibernate/SharedSessionContract.java index 3b3d6cea85..b57451ce3a 100644 --- a/hibernate-core/src/main/java/org/hibernate/SharedSessionContract.java +++ b/hibernate-core/src/main/java/org/hibernate/SharedSessionContract.java @@ -246,6 +246,8 @@ default T doReturningWork(ReturningWork work) throws HibernateException { /** * Create a new mutable {@link EntityGraph} with only a root node. * + * @param rootType the root entity class of the graph + * * @since 6.3 */ RootGraph createEntityGraph(Class rootType); @@ -263,6 +265,23 @@ default T doReturningWork(ReturningWork work) throws HibernateException { */ RootGraph createEntityGraph(String graphName); + /** + * Create a new mutable copy of the named {@link EntityGraph}, + * or return {@code null} if there is no graph with the given + * name. + * + * @param rootType the root entity class of the graph + * @param graphName the name of the graph + * + * @see jakarta.persistence.EntityManagerFactory#addNamedEntityGraph(String, EntityGraph) + * + * @throws IllegalArgumentException if the graph with the given + * name does not have the given entity type as its root + * + * @since 6.3 + */ + RootGraph createEntityGraph(Class rootType, String graphName); + /** * Retrieve the named {@link EntityGraph} as an immutable graph, * or return {@code null} if there is no graph with the given diff --git a/hibernate-core/src/main/java/org/hibernate/engine/spi/SessionDelegatorBaseImpl.java b/hibernate-core/src/main/java/org/hibernate/engine/spi/SessionDelegatorBaseImpl.java index e5b7ae0ff2..e2da4601fa 100644 --- a/hibernate-core/src/main/java/org/hibernate/engine/spi/SessionDelegatorBaseImpl.java +++ b/hibernate-core/src/main/java/org/hibernate/engine/spi/SessionDelegatorBaseImpl.java @@ -43,6 +43,7 @@ import org.hibernate.event.spi.MergeContext; import org.hibernate.event.spi.PersistContext; import org.hibernate.event.spi.RefreshContext; +import org.hibernate.graph.RootGraph; import org.hibernate.graph.spi.RootGraphImplementor; import org.hibernate.jdbc.ReturningWork; import org.hibernate.jdbc.Work; @@ -458,6 +459,11 @@ public RootGraphImplementor createEntityGraph(String graphName) { return delegate.createEntityGraph( graphName ); } + @Override + public RootGraph createEntityGraph(Class rootType, String graphName) { + return delegate.createEntityGraph( rootType, graphName ); + } + @Override public RootGraphImplementor getEntityGraph(String graphName) { return delegate.getEntityGraph( graphName ); diff --git a/hibernate-core/src/main/java/org/hibernate/engine/spi/SessionLazyDelegator.java b/hibernate-core/src/main/java/org/hibernate/engine/spi/SessionLazyDelegator.java index 0df894c9bf..1fce375e30 100644 --- a/hibernate-core/src/main/java/org/hibernate/engine/spi/SessionLazyDelegator.java +++ b/hibernate-core/src/main/java/org/hibernate/engine/spi/SessionLazyDelegator.java @@ -530,6 +530,11 @@ public RootGraph createEntityGraph(String graphName) { return this.lazySession.get().createEntityGraph( graphName ); } + @Override + public RootGraph createEntityGraph(Class rootType, String graphName) { + return this.lazySession.get().createEntityGraph( rootType, graphName ); + } + @Override public RootGraph getEntityGraph(String graphName) { return this.lazySession.get().getEntityGraph( graphName ); diff --git a/hibernate-core/src/main/java/org/hibernate/engine/spi/SharedSessionDelegatorBaseImpl.java b/hibernate-core/src/main/java/org/hibernate/engine/spi/SharedSessionDelegatorBaseImpl.java index 4b48bd060c..acf5f624f6 100644 --- a/hibernate-core/src/main/java/org/hibernate/engine/spi/SharedSessionDelegatorBaseImpl.java +++ b/hibernate-core/src/main/java/org/hibernate/engine/spi/SharedSessionDelegatorBaseImpl.java @@ -607,6 +607,11 @@ public RootGraph createEntityGraph(String graphName) { return delegate.createEntityGraph( graphName ); } + @Override + public RootGraph createEntityGraph(Class rootType, String graphName) { + return delegate.createEntityGraph( rootType, graphName ); + } + @Override public RootGraph getEntityGraph(String graphName) { return delegate.getEntityGraph( graphName ); diff --git a/hibernate-core/src/main/java/org/hibernate/internal/AbstractSharedSessionContract.java b/hibernate-core/src/main/java/org/hibernate/internal/AbstractSharedSessionContract.java index 8783bf0976..cee8b745bb 100644 --- a/hibernate-core/src/main/java/org/hibernate/internal/AbstractSharedSessionContract.java +++ b/hibernate-core/src/main/java/org/hibernate/internal/AbstractSharedSessionContract.java @@ -13,6 +13,7 @@ import java.util.List; import java.util.Locale; import java.util.Map; +import java.util.Objects; import java.util.TimeZone; import java.util.UUID; import java.util.function.Function; @@ -42,6 +43,7 @@ import org.hibernate.engine.spi.SharedSessionContractImplementor; import org.hibernate.engine.transaction.internal.TransactionImpl; import org.hibernate.engine.transaction.spi.TransactionImplementor; +import org.hibernate.graph.RootGraph; import org.hibernate.graph.internal.RootGraphImpl; import org.hibernate.graph.spi.RootGraphImplementor; import org.hibernate.id.uuid.StandardRandomStrategy; @@ -52,6 +54,7 @@ import org.hibernate.jpa.spi.NativeQueryListTransformer; import org.hibernate.jpa.spi.NativeQueryMapTransformer; import org.hibernate.jpa.spi.NativeQueryTupleTransformer; +import org.hibernate.metamodel.model.domain.ManagedDomainType; import org.hibernate.persister.entity.EntityPersister; import org.hibernate.procedure.ProcedureCall; import org.hibernate.procedure.internal.ProcedureCallImpl; @@ -1382,6 +1385,22 @@ public RootGraphImplementor createEntityGraph(Class rootType) { return new RootGraphImpl<>( null, getFactory().getJpaMetamodel().entity( rootType ) ); } + @Override @SuppressWarnings("unchecked") + public RootGraph createEntityGraph(Class rootType, String graphName) { + final RootGraph entityGraph = createEntityGraph( graphName ); + if ( entityGraph == null ) { + return null; + } + final ManagedDomainType type = getFactory().getJpaMetamodel().managedType( rootType ); + final ManagedDomainType graphedType = entityGraph.getGraphedType(); + if ( !Objects.equals( graphedType.getTypeName(), type.getTypeName() ) ) { + throw new IllegalArgumentException( "Named entity graph '" + graphName + + "' is for type '" + graphedType.getTypeName() + "'"); + } + return (RootGraph) entityGraph; + } + + @Override public RootGraphImplementor createEntityGraph(String graphName) { checkOpen();