diff --git a/hibernate-core/src/main/java/org/hibernate/boot/internal/SessionFactoryOptionsBuilder.java b/hibernate-core/src/main/java/org/hibernate/boot/internal/SessionFactoryOptionsBuilder.java index 77f4da8da3bd..b6e451464448 100644 --- a/hibernate-core/src/main/java/org/hibernate/boot/internal/SessionFactoryOptionsBuilder.java +++ b/hibernate-core/src/main/java/org/hibernate/boot/internal/SessionFactoryOptionsBuilder.java @@ -110,6 +110,7 @@ import static org.hibernate.internal.util.config.ConfigurationHelper.getInteger; import static org.hibernate.internal.util.config.ConfigurationHelper.getString; import static org.hibernate.jpa.internal.util.CacheModeHelper.interpretCacheMode; +import static org.hibernate.jpa.internal.util.ConfigurationHelper.getFlushMode; import static org.hibernate.type.format.jackson.JacksonIntegration.getJsonJacksonFormatMapperOrNull; import static org.hibernate.type.format.jackson.JacksonIntegration.getXMLJacksonFormatMapperOrNull; import static org.hibernate.type.format.jakartajson.JakartaJsonIntegration.getJakartaJsonBFormatMapperOrNull; @@ -1620,9 +1621,8 @@ public LockOptions getDefaultLockOptions() { return defaultLockOptions; } - private static FlushMode defaultFlushMode(Map defaultSessionProperties) { - final Object setMode = defaultSessionProperties.get( HibernateHints.HINT_FLUSH_MODE ); - return org.hibernate.jpa.internal.util.ConfigurationHelper.getFlushMode( setMode, FlushMode.AUTO ); + private static FlushMode defaultFlushMode(Map properties) { + return getFlushMode( properties.get( HibernateHints.HINT_FLUSH_MODE ), FlushMode.AUTO ); } private static LockOptions defaultLockOptions(Map defaultSessionProperties) { @@ -1640,9 +1640,9 @@ private Map initializeDefaultSessionProperties(ConfigurationServ final HashMap settings = new HashMap<>(); //Static defaults: - settings.putIfAbsent( HibernateHints.HINT_FLUSH_MODE, FlushMode.AUTO.name() ); - settings.putIfAbsent( JPA_LOCK_SCOPE, PessimisticLockScope.EXTENDED.name() ); - settings.putIfAbsent( JAKARTA_LOCK_SCOPE, PessimisticLockScope.EXTENDED.name() ); + settings.putIfAbsent( HibernateHints.HINT_FLUSH_MODE, FlushMode.AUTO ); + settings.putIfAbsent( JPA_LOCK_SCOPE, PessimisticLockScope.EXTENDED ); + settings.putIfAbsent( JAKARTA_LOCK_SCOPE, PessimisticLockScope.EXTENDED ); settings.putIfAbsent( JPA_LOCK_TIMEOUT, LockOptions.WAIT_FOREVER ); settings.putIfAbsent( JAKARTA_LOCK_TIMEOUT, LockOptions.WAIT_FOREVER ); settings.putIfAbsent( JPA_SHARED_CACHE_RETRIEVE_MODE, CacheModeHelper.DEFAULT_RETRIEVE_MODE ); diff --git a/hibernate-core/src/main/java/org/hibernate/internal/SessionImpl.java b/hibernate-core/src/main/java/org/hibernate/internal/SessionImpl.java index f6b5c053931d..e157a30d435e 100644 --- a/hibernate-core/src/main/java/org/hibernate/internal/SessionImpl.java +++ b/hibernate-core/src/main/java/org/hibernate/internal/SessionImpl.java @@ -332,10 +332,14 @@ private Integer getHintedLockTimeout() { private Object getSessionProperty(String propertyName) { return properties == null - ? getSessionFactoryOptions().getDefaultSessionProperties().get( propertyName ) + ? getDefaultProperties().get( propertyName ) : properties.get( propertyName ); } + private Map getDefaultProperties() { + return getSessionFactoryOptions().getDefaultSessionProperties(); + } + @Override public SharedSessionBuilder sessionWithOptions() { return new SharedSessionBuilderImpl( this ); @@ -2810,7 +2814,7 @@ public void setProperty(String propertyName, Object value) { // store property for future reference: if ( properties == null ) { - properties = computeCurrentSessionProperties(); + properties = computeCurrentProperties(); } properties.put( propertyName, value ); @@ -2878,18 +2882,18 @@ private void interpretProperty(String propertyName, Object value) { } } - private Map computeCurrentSessionProperties() { - final Map map = new HashMap<>( getSessionFactoryOptions().getDefaultSessionProperties() ); + private Map computeCurrentProperties() { + final var map = new HashMap<>( getDefaultProperties() ); //The FLUSH_MODE is always set at Session creation time, //so it needs special treatment to not eagerly initialize this Map: - map.put( HINT_FLUSH_MODE, getHibernateFlushMode().name() ); + map.put( HINT_FLUSH_MODE, getHibernateFlushMode() ); return map; } @Override public Map getProperties() { if ( properties == null ) { - properties = computeCurrentSessionProperties(); + properties = computeCurrentProperties(); } return unmodifiableMap( properties ); } diff --git a/hibernate-core/src/main/java/org/hibernate/jpa/HibernateHints.java b/hibernate-core/src/main/java/org/hibernate/jpa/HibernateHints.java index 2f88e6ca6237..cb3f4b6bc6c3 100644 --- a/hibernate-core/src/main/java/org/hibernate/jpa/HibernateHints.java +++ b/hibernate-core/src/main/java/org/hibernate/jpa/HibernateHints.java @@ -4,8 +4,6 @@ */ package org.hibernate.jpa; -import org.hibernate.type.BindableType; - /** * List of Hibernate-specific (extension) hints available to query, * load, and lock scenarios. @@ -167,7 +165,7 @@ public interface HibernateHints { /** * The {@linkplain org.hibernate.type.SqlTypes JDBC type code}, - * {@linkplain BindableType type}, or + * {@linkplain jakarta.persistence.metamodel.Type type}, or * {@link Class} of the value returned by a SQL function called * via {@link org.hibernate.procedure.ProcedureCall} or * {@link jakarta.persistence.StoredProcedureQuery}. Has the side @@ -175,7 +173,7 @@ public interface HibernateHints { * rather than a call to a stored procedure. * * @see org.hibernate.procedure.ProcedureCall#markAsFunctionCall(int) - * @see org.hibernate.procedure.ProcedureCall#markAsFunctionCall(BindableType) + * @see org.hibernate.procedure.ProcedureCall#markAsFunctionCall(jakarta.persistence.metamodel.Type) * @see org.hibernate.procedure.ProcedureCall#markAsFunctionCall(Class) */ String HINT_CALLABLE_FUNCTION_RETURN_TYPE = "hibernate.procedure.function_return_jdbc_type_code"; diff --git a/hibernate-core/src/main/java/org/hibernate/query/NullPrecedence.java b/hibernate-core/src/main/java/org/hibernate/query/NullPrecedence.java index 73a7a674cd61..ca12b2afcd15 100644 --- a/hibernate-core/src/main/java/org/hibernate/query/NullPrecedence.java +++ b/hibernate-core/src/main/java/org/hibernate/query/NullPrecedence.java @@ -7,6 +7,7 @@ import org.hibernate.dialect.NullOrdering; import jakarta.persistence.criteria.Nulls; +import org.hibernate.query.internal.NullPrecedenceHelper; /** * Enumerates the possibilities for the precedence of null values within @@ -38,21 +39,7 @@ public enum NullPrecedence { */ @Deprecated(since = "7.0", forRemoval = true) public boolean isDefaultOrdering(SortDirection sortOrder, NullOrdering nullOrdering) { - return switch (this) { - case NONE -> true; - case FIRST -> switch (nullOrdering) { - case FIRST -> true; - case LAST -> false; - case SMALLEST -> sortOrder == SortDirection.ASCENDING; - case GREATEST -> sortOrder == SortDirection.DESCENDING; - }; - case LAST -> switch (nullOrdering) { - case LAST -> true; - case FIRST -> false; - case SMALLEST -> sortOrder == SortDirection.DESCENDING; - case GREATEST -> sortOrder == SortDirection.ASCENDING; - }; - }; + return NullPrecedenceHelper.isDefaultOrdering( getJpaValue(), sortOrder, nullOrdering ); } /** @@ -99,6 +86,5 @@ public static NullPrecedence fromJpaValue(Nulls jpaValue) { case FIRST -> NullPrecedence.FIRST; case LAST -> NullPrecedence.LAST; }; - } } diff --git a/hibernate-core/src/main/java/org/hibernate/query/internal/DelegatingDomainQueryExecutionContext.java b/hibernate-core/src/main/java/org/hibernate/query/internal/DelegatingDomainQueryExecutionContext.java index 0849b5f876dd..b2aa4ce7e634 100644 --- a/hibernate-core/src/main/java/org/hibernate/query/internal/DelegatingDomainQueryExecutionContext.java +++ b/hibernate-core/src/main/java/org/hibernate/query/internal/DelegatingDomainQueryExecutionContext.java @@ -16,7 +16,7 @@ public class DelegatingDomainQueryExecutionContext implements DomainQueryExecutionContext { private final DomainQueryExecutionContext delegate; - public DelegatingDomainQueryExecutionContext(DomainQueryExecutionContext delegate) { + public DelegatingDomainQueryExecutionContext(DomainQueryExecutionContext delegate) { this.delegate = delegate; } diff --git a/hibernate-core/src/main/java/org/hibernate/query/internal/ImplicitAttributeFetchMemento.java b/hibernate-core/src/main/java/org/hibernate/query/internal/ImplicitAttributeFetchMemento.java deleted file mode 100644 index 5680e0fb21b2..000000000000 --- a/hibernate-core/src/main/java/org/hibernate/query/internal/ImplicitAttributeFetchMemento.java +++ /dev/null @@ -1,40 +0,0 @@ -/* - * SPDX-License-Identifier: Apache-2.0 - * Copyright Red Hat Inc. and Hibernate Authors - */ -package org.hibernate.query.internal; - -import java.util.function.Consumer; - -import org.hibernate.metamodel.mapping.AttributeMapping; -import org.hibernate.spi.NavigablePath; -import org.hibernate.query.named.FetchMemento; -import org.hibernate.query.results.FetchBuilder; -import org.hibernate.query.results.internal.implicit.ImplicitAttributeFetchBuilder; - -/** - * @author Steve Ebersole - */ -public class ImplicitAttributeFetchMemento implements FetchMemento { - private final NavigablePath navigablePath; - private final AttributeMapping attributeMapping; - - public ImplicitAttributeFetchMemento(NavigablePath navigablePath, AttributeMapping attributeMapping) { - this.navigablePath = navigablePath; - this.attributeMapping = attributeMapping; - } - - @Override - public FetchBuilder resolve( - Parent parent, - Consumer querySpaceConsumer, - ResultSetMappingResolutionContext context) { - return new ImplicitAttributeFetchBuilder( navigablePath, attributeMapping ); - } - - @Override - public NavigablePath getNavigablePath() { - return navigablePath; - } - -} diff --git a/hibernate-core/src/main/java/org/hibernate/query/internal/ImplicitModelPartResultMemento.java b/hibernate-core/src/main/java/org/hibernate/query/internal/ImplicitModelPartResultMemento.java deleted file mode 100644 index 86beadd229de..000000000000 --- a/hibernate-core/src/main/java/org/hibernate/query/internal/ImplicitModelPartResultMemento.java +++ /dev/null @@ -1,57 +0,0 @@ -/* - * SPDX-License-Identifier: Apache-2.0 - * Copyright Red Hat Inc. and Hibernate Authors - */ -package org.hibernate.query.internal; - -import java.util.function.Consumer; - -import org.hibernate.metamodel.mapping.BasicValuedModelPart; -import org.hibernate.metamodel.mapping.EmbeddableValuedModelPart; -import org.hibernate.metamodel.mapping.EntityValuedModelPart; -import org.hibernate.metamodel.mapping.ModelPart; -import org.hibernate.spi.NavigablePath; -import org.hibernate.query.named.ModelPartResultMemento; -import org.hibernate.query.results.internal.implicit.ImplicitModelPartResultBuilderBasic; -import org.hibernate.query.results.internal.implicit.ImplicitModelPartResultBuilderEmbeddable; -import org.hibernate.query.results.internal.implicit.ImplicitModelPartResultBuilderEntity; -import org.hibernate.query.results.ResultBuilder; - -/** - * @author Steve Ebersole - */ -public class ImplicitModelPartResultMemento implements ModelPartResultMemento { - private final NavigablePath navigablePath; - private final ModelPart referencedModelPart; - - public ImplicitModelPartResultMemento(NavigablePath navigablePath, ModelPart referencedModelPart) { - this.navigablePath = navigablePath; - this.referencedModelPart = referencedModelPart; - } - - @Override - public NavigablePath getNavigablePath() { - return navigablePath; - } - - @Override - public ResultBuilder resolve( - Consumer querySpaceConsumer, - ResultSetMappingResolutionContext context) { - final BasicValuedModelPart basicPart = referencedModelPart.asBasicValuedModelPart(); - if ( basicPart != null ) { - return new ImplicitModelPartResultBuilderBasic( navigablePath, basicPart ); - } - - if ( referencedModelPart instanceof EmbeddableValuedModelPart embeddableValuedModelPart ) { - // todo (6.0) : can this really happen? - return new ImplicitModelPartResultBuilderEmbeddable( navigablePath, embeddableValuedModelPart ); - } - - if ( referencedModelPart instanceof EntityValuedModelPart entityValuedModelPart ) { - return new ImplicitModelPartResultBuilderEntity( navigablePath, entityValuedModelPart ); - } - - throw new IllegalStateException( "Unknown type of model part : "+ referencedModelPart ); - } -} diff --git a/hibernate-core/src/main/java/org/hibernate/query/internal/NamedQueryHelper.java b/hibernate-core/src/main/java/org/hibernate/query/internal/NamedQueryHelper.java deleted file mode 100644 index b5c0219f38a5..000000000000 --- a/hibernate-core/src/main/java/org/hibernate/query/internal/NamedQueryHelper.java +++ /dev/null @@ -1,227 +0,0 @@ -/* - * SPDX-License-Identifier: Apache-2.0 - * Copyright Red Hat Inc. and Hibernate Authors - */ -package org.hibernate.query.internal; - -import java.util.Map; - -import org.hibernate.CacheMode; -import org.hibernate.FlushMode; -import org.hibernate.LockMode; -import org.hibernate.LockOptions; -import org.hibernate.engine.spi.SessionFactoryImplementor; -import org.hibernate.internal.util.config.ConfigurationHelper; -import org.hibernate.jpa.internal.util.FlushModeTypeHelper; -import org.hibernate.jpa.internal.util.LockModeTypeHelper; - -import jakarta.persistence.FlushModeType; -import jakarta.persistence.LockModeType; - -import static org.hibernate.jpa.HibernateHints.HINT_CACHEABLE; -import static org.hibernate.jpa.HibernateHints.HINT_CACHE_MODE; -import static org.hibernate.jpa.HibernateHints.HINT_CACHE_REGION; -import static org.hibernate.jpa.HibernateHints.HINT_FLUSH_MODE; -import static org.hibernate.jpa.HibernateHints.HINT_NATIVE_LOCK_MODE; -import static org.hibernate.jpa.HibernateHints.HINT_READ_ONLY; - -/** - * @author Steve Ebersole - */ -public class NamedQueryHelper { - public static abstract class NamedQueryDescriptorBuilder { - private final String name; - private final Map hints; - - private Boolean cacheable; - private String cacheRegion; - private CacheMode cacheMode; - - private FlushMode flushMode; - private Boolean readOnly; - - private LockOptions lockOptions; - - private Integer timeout; - private Integer fetchSize; - - private String comment; - - public NamedQueryDescriptorBuilder( - String name, - Map hints, - SessionFactoryImplementor sessionFactory) { - this.name = name; - this.hints = hints; - - cacheable = isCacheable( hints, sessionFactory ); - cacheRegion = cacheable ? determineCacheRegion( hints, sessionFactory ) : null; - cacheMode = cacheable ? determineCacheMode( hints, sessionFactory ) : null; - - flushMode = determineFlushMode( hints, sessionFactory ); - readOnly = ConfigurationHelper.getBoolean( HINT_READ_ONLY, hints ); - - lockOptions = determineLockOptions( hints, sessionFactory ); - - timeout = determineTimeout( hints, sessionFactory ); - - } - - public String getName() { - return name; - } - - public Map getHints() { - return hints; - } - - public Boolean getCacheable() { - return cacheable; - } - - public void setCacheable(Boolean cacheable) { - this.cacheable = cacheable; - } - - public String getCacheRegion() { - return cacheRegion; - } - - public void setCacheRegion(String cacheRegion) { - this.cacheRegion = cacheRegion; - } - - public CacheMode getCacheMode() { - return cacheMode; - } - - public void setCacheMode(CacheMode cacheMode) { - this.cacheMode = cacheMode; - } - - public FlushMode getFlushMode() { - return flushMode; - } - - public void setFlushMode(FlushMode flushMode) { - this.flushMode = flushMode; - } - - public Boolean getReadOnly() { - return readOnly; - } - - public void setReadOnly(Boolean readOnly) { - this.readOnly = readOnly; - } - - public LockOptions getLockOptions() { - return lockOptions; - } - - public void setLockOptions(LockOptions lockOptions) { - this.lockOptions = lockOptions; - } - - public Integer getTimeout() { - return timeout; - } - - public void setTimeout(Integer timeout) { - this.timeout = timeout; - } - - public Integer getFetchSize() { - return fetchSize; - } - - public void setFetchSize(Integer fetchSize) { - this.fetchSize = fetchSize; - } - - public String getComment() { - return comment; - } - - public void setComment(String comment) { - this.comment = comment; - } - } - - private static boolean isCacheable(Map hints, SessionFactoryImplementor sessionFactory) { - return sessionFactory.getSessionFactoryOptions().isQueryCacheEnabled() - && ConfigurationHelper.getBoolean( HINT_CACHEABLE, hints ); - } - - private static String determineCacheRegion(Map hints, SessionFactoryImplementor sessionFactory) { - assert sessionFactory.getSessionFactoryOptions().isQueryCacheEnabled(); - return ConfigurationHelper.getString( HINT_CACHE_REGION, hints ); - } - - private static CacheMode determineCacheMode(Map hints, SessionFactoryImplementor sessionFactory) { - assert sessionFactory.getSessionFactoryOptions().isQueryCacheEnabled(); - final Object setting = hints.get( HINT_CACHE_MODE ); - - if ( setting != null ) { - if ( setting instanceof CacheMode cacheMode ) { - return cacheMode; - } - - final CacheMode cacheMode = CacheMode.interpretExternalSetting( setting.toString() ); - if ( cacheMode != null ) { - return cacheMode; - } - } - - return CacheMode.NORMAL; - } - - private static FlushMode determineFlushMode(Map hints, SessionFactoryImplementor sessionFactory) { - final Object setting = hints.get( HINT_FLUSH_MODE ); - - if ( setting != null ) { - if ( setting instanceof FlushMode flushMode ) { - return flushMode; - } - - if ( setting instanceof FlushModeType flushModeType ) { - return FlushModeTypeHelper.getFlushMode( flushModeType ); - } - - final FlushMode mode = FlushMode.interpretExternalSetting( setting.toString() ); - if ( mode != null ) { - return mode; - } - } - - return FlushMode.AUTO; - } - - private static LockOptions determineLockOptions(Map hints, SessionFactoryImplementor sessionFactory) { - final Object lockModeSetting = hints.get( HINT_NATIVE_LOCK_MODE ); - final LockMode lockMode; - if ( lockModeSetting == null ) { - lockMode = LockMode.NONE; - } - else if ( lockModeSetting instanceof LockMode mode ) { - lockMode = mode; - } - else if ( lockModeSetting instanceof LockModeType lockModeType ) { - lockMode = LockModeTypeHelper.getLockMode( lockModeType ); - } - else { - lockMode = LockMode.fromExternalForm( lockModeSetting.toString() ); - } - - if ( lockMode == LockMode.NONE ) { - return LockOptions.NONE; - } - else { - return new LockOptions( lockMode ); - } - } - - private static Integer determineTimeout(Map hints, SessionFactoryImplementor sessionFactory) { - return null; - } -} diff --git a/hibernate-core/src/main/java/org/hibernate/query/internal/NullPrecedenceHelper.java b/hibernate-core/src/main/java/org/hibernate/query/internal/NullPrecedenceHelper.java index 620c0b90dfc9..d603ec10028a 100644 --- a/hibernate-core/src/main/java/org/hibernate/query/internal/NullPrecedenceHelper.java +++ b/hibernate-core/src/main/java/org/hibernate/query/internal/NullPrecedenceHelper.java @@ -4,7 +4,6 @@ */ package org.hibernate.query.internal; -import org.hibernate.AssertionFailure; import org.hibernate.dialect.NullOrdering; import org.hibernate.query.SortDirection; @@ -22,38 +21,21 @@ public static boolean isDefaultOrdering( Nulls precedence, SortDirection sortOrder, NullOrdering nullOrdering) { - switch (precedence) { - case NONE: - return true; - case FIRST: - switch ( nullOrdering ) { - case FIRST: - return true; - case LAST: - return false; - case SMALLEST: - return sortOrder == SortDirection.ASCENDING; - case GREATEST: - return sortOrder == SortDirection.DESCENDING; - default: - throw new AssertionFailure( "Unrecognized NullOrdering"); - } - case LAST: - switch ( nullOrdering ) { - case LAST: - return true; - case FIRST: - return false; - case SMALLEST: - return sortOrder == SortDirection.DESCENDING; - case GREATEST: - return sortOrder == SortDirection.ASCENDING; - default: - throw new AssertionFailure("Unrecognized NullOrdering"); - } - default: - throw new AssertionFailure("Unrecognized NullPrecedence"); - } + return switch ( precedence ) { + case NONE -> true; + case FIRST -> switch ( nullOrdering ) { + case FIRST -> true; + case LAST -> false; + case SMALLEST -> sortOrder == SortDirection.ASCENDING; + case GREATEST -> sortOrder == SortDirection.DESCENDING; + }; + case LAST -> switch ( nullOrdering ) { + case LAST -> true; + case FIRST -> false; + case SMALLEST -> sortOrder == SortDirection.DESCENDING; + case GREATEST -> sortOrder == SortDirection.ASCENDING; + }; + }; } /** diff --git a/hibernate-core/src/main/java/org/hibernate/query/spi/CloseableIterator.java b/hibernate-core/src/main/java/org/hibernate/query/spi/CloseableIterator.java index efadae0548f0..9df91618e485 100644 --- a/hibernate-core/src/main/java/org/hibernate/query/spi/CloseableIterator.java +++ b/hibernate-core/src/main/java/org/hibernate/query/spi/CloseableIterator.java @@ -9,7 +9,7 @@ import org.hibernate.Incubating; /** - * Unification of Iterator and AutoCloseable + * Unification of {@link Iterator} and {@link AutoCloseable}. * * @author Steve Ebersole * diff --git a/hibernate-core/src/test/java/org/hibernate/orm/test/jpa/EntityManagerTest.java b/hibernate-core/src/test/java/org/hibernate/orm/test/jpa/EntityManagerTest.java index aaea2e2d12c9..769d44ff108f 100644 --- a/hibernate-core/src/test/java/org/hibernate/orm/test/jpa/EntityManagerTest.java +++ b/hibernate-core/src/test/java/org/hibernate/orm/test/jpa/EntityManagerTest.java @@ -344,7 +344,7 @@ public void testSetProperty() throws Exception { em.getTransaction().commit(); em.clear(); - assertEquals( em.getProperties().get(HibernateHints.HINT_FLUSH_MODE), "AUTO" ); + assertEquals( em.getProperties().get(HibernateHints.HINT_FLUSH_MODE), FlushMode.AUTO ); assertNotNull( "With default settings the entity should be persisted on commit.", em.find( Wallet.class, wallet.getSerial() )