diff --git a/hibernate-core/src/main/java/org/hibernate/boot/beanvalidation/BeanValidationEventListener.java b/hibernate-core/src/main/java/org/hibernate/boot/beanvalidation/BeanValidationEventListener.java index 956e11a04b96..0eb291ce4293 100644 --- a/hibernate-core/src/main/java/org/hibernate/boot/beanvalidation/BeanValidationEventListener.java +++ b/hibernate-core/src/main/java/org/hibernate/boot/beanvalidation/BeanValidationEventListener.java @@ -56,17 +56,17 @@ public class BeanValidationEventListener public BeanValidationEventListener( ValidatorFactory factory, Map settings, ClassLoaderService classLoaderService) { traversableResolver = new HibernateTraversableResolver(); - validator = factory.usingContext() - .traversableResolver( traversableResolver ) - .getValidator(); + validator = + factory.usingContext() + .traversableResolver( traversableResolver ) + .getValidator(); groupsPerOperation = GroupsPerOperation.from( settings, new ClassLoaderAccessImpl( classLoaderService ) ); } @Override public void sessionFactoryCreated(SessionFactory factory) { - SessionFactoryImplementor implementor = factory.unwrap( SessionFactoryImplementor.class ); - implementor - .getMappingMetamodel() + var implementor = factory.unwrap( SessionFactoryImplementor.class ); + implementor.getMappingMetamodel() .forEachEntityDescriptor( entityPersister -> traversableResolver.addPersister( entityPersister, implementor ) ); } @@ -74,7 +74,6 @@ public boolean onPreInsert(PreInsertEvent event) { validate( event.getEntity(), event.getPersister(), - event.getFactory(), GroupsPerOperation.Operation.INSERT ); return false; @@ -84,7 +83,6 @@ public boolean onPreUpdate(PreUpdateEvent event) { validate( event.getEntity(), event.getPersister(), - event.getFactory(), GroupsPerOperation.Operation.UPDATE ); return false; @@ -94,7 +92,6 @@ public boolean onPreDelete(PreDeleteEvent event) { validate( event.getEntity(), event.getPersister(), - event.getFactory(), GroupsPerOperation.Operation.DELETE ); return false; @@ -105,7 +102,6 @@ public boolean onPreUpsert(PreUpsertEvent event) { validate( event.getEntity(), event.getPersister(), - event.getFactory(), GroupsPerOperation.Operation.UPSERT ); return false; @@ -117,7 +113,6 @@ public void onPreUpdateCollection(PreCollectionUpdateEvent event) { validate( entity, event.getSession().getEntityPersister( event.getAffectedOwnerEntityName(), entity ), - event.getFactory(), GroupsPerOperation.Operation.UPDATE ); } @@ -125,46 +120,45 @@ public void onPreUpdateCollection(PreCollectionUpdateEvent event) { private void validate( T object, EntityPersister persister, - SessionFactoryImplementor sessionFactory, GroupsPerOperation.Operation operation) { - if ( object == null || persister.getRepresentationStrategy().getMode() != RepresentationMode.POJO ) { - return; - } - final Class[] groups = groupsPerOperation.get( operation ); - if ( groups.length > 0 ) { - final Set> constraintViolations = validator.validate( object, groups ); - if ( !constraintViolations.isEmpty() ) { - final Set> propagatedViolations = setOfSize( constraintViolations.size() ); - final Set classNames = new HashSet<>(); - for ( ConstraintViolation violation : constraintViolations ) { - LOG.trace( violation ); - propagatedViolations.add( violation ); - classNames.add( violation.getLeafBean().getClass().getName() ); - } - final StringBuilder builder = new StringBuilder(); - builder.append( "Validation failed for classes " ); - builder.append( classNames ); - builder.append( " during " ); - builder.append( operation.getName() ); - builder.append( " time for groups " ); - builder.append( toString( groups ) ); - builder.append( "\nList of constraint violations:[\n" ); - for ( ConstraintViolation violation : constraintViolations ) { - builder.append( "\t" ).append( violation.toString() ).append( "\n" ); + if ( object != null + && persister.getRepresentationStrategy().getMode() == RepresentationMode.POJO ) { + final Class[] groups = groupsPerOperation.get( operation ); + if ( groups.length > 0 ) { + final var constraintViolations = validator.validate( object, groups ); + if ( !constraintViolations.isEmpty() ) { + final Set> propagatedViolations = setOfSize( constraintViolations.size() ); + final Set classNames = new HashSet<>(); + for ( var violation : constraintViolations ) { + LOG.trace( violation ); + propagatedViolations.add( violation ); + classNames.add( violation.getLeafBean().getClass().getName() ); + } + final var builder = + new StringBuilder() + .append( "Validation failed for classes " ) + .append( classNames ) + .append( " during " ) + .append( operation.getName() ) + .append( " time for groups " ) + .append( toString( groups ) ) + .append( "\nList of constraint violations:[\n" ); + for ( var violation : constraintViolations ) { + builder.append( "\t" ).append( violation.toString() ).append( "\n" ); + } + builder.append( "]" ); + throw new ConstraintViolationException( builder.toString(), propagatedViolations ); } - builder.append( "]" ); - - throw new ConstraintViolationException( builder.toString(), propagatedViolations ); } } } private String toString(Class[] groups) { - final StringBuilder toString = new StringBuilder( "[" ); - for ( Class group : groups ) { - toString.append( group.getName() ).append( ", " ); + final var string = new StringBuilder( "[" ); + for ( var group : groups ) { + string.append( group.getName() ).append( ", " ); } - toString.append( "]" ); - return toString.toString(); + string.append( "]" ); + return string.toString(); } } diff --git a/hibernate-core/src/main/java/org/hibernate/boot/beanvalidation/BeanValidationIntegrator.java b/hibernate-core/src/main/java/org/hibernate/boot/beanvalidation/BeanValidationIntegrator.java index bc29f95ce606..da6dcb0f993a 100644 --- a/hibernate-core/src/main/java/org/hibernate/boot/beanvalidation/BeanValidationIntegrator.java +++ b/hibernate-core/src/main/java/org/hibernate/boot/beanvalidation/BeanValidationIntegrator.java @@ -17,7 +17,6 @@ import org.hibernate.integrator.spi.Integrator; import org.hibernate.internal.CoreLogging; import org.hibernate.internal.CoreMessageLogger; -import org.hibernate.service.spi.ServiceRegistryImplementor; import org.hibernate.service.spi.SessionFactoryServiceRegistry; /** @@ -48,9 +47,12 @@ public class BeanValidationIntegrator implements Integrator { public static void validateFactory(Object object) { try { // this direct usage of ClassLoader should be fine since the classes exist in the same jar - final Class activatorClass = BeanValidationIntegrator.class.getClassLoader().loadClass( ACTIVATOR_CLASS_NAME ); + final var activatorClass = + BeanValidationIntegrator.class.getClassLoader() + .loadClass( ACTIVATOR_CLASS_NAME ); try { - final Method validateMethod = activatorClass.getMethod( VALIDATE_SUPPLIED_FACTORY_METHOD_NAME, Object.class ); + final var validateMethod = + activatorClass.getMethod( VALIDATE_SUPPLIED_FACTORY_METHOD_NAME, Object.class ); try { validateMethod.invoke( null, object ); } @@ -84,14 +86,14 @@ public void integrate( Metadata metadata, BootstrapContext bootstrapContext, SessionFactoryImplementor sessionFactory) { - final ServiceRegistryImplementor serviceRegistry = sessionFactory.getServiceRegistry(); - final ConfigurationService cfgService = serviceRegistry.requireService( ConfigurationService.class ); - // IMPL NOTE : see the comments on ActivationContext.getValidationModes() as to why this is multi-valued... + final var serviceRegistry = sessionFactory.getServiceRegistry(); + final var cfgService = serviceRegistry.requireService( ConfigurationService.class ); + // IMPL NOTE: see the comments on ActivationContext.getValidationModes() as to why this is multi-valued... Object modeSetting = cfgService.getSettings().get( JAKARTA_MODE_PROPERTY ); if ( modeSetting == null ) { modeSetting = cfgService.getSettings().get( MODE_PROPERTY ); } - final Set modes = ValidationMode.getModes( modeSetting ); + final var modes = ValidationMode.getModes( modeSetting ); if ( modes.size() > 1 ) { LOG.multipleValidationModes( ValidationMode.loggable( modes ) ); } @@ -100,8 +102,7 @@ public void integrate( return; } - final ClassLoaderService classLoaderService = serviceRegistry.requireService( ClassLoaderService.class ); - + final var classLoaderService = serviceRegistry.requireService( ClassLoaderService.class ); // see if the Bean Validation API is available on the classpath if ( isBeanValidationApiAvailable( classLoaderService ) ) { // and if so, call out to the TypeSafeActivator diff --git a/hibernate-core/src/main/java/org/hibernate/boot/beanvalidation/HibernateTraversableResolver.java b/hibernate-core/src/main/java/org/hibernate/boot/beanvalidation/HibernateTraversableResolver.java index 84c0e871be15..70adba58eaa6 100644 --- a/hibernate-core/src/main/java/org/hibernate/boot/beanvalidation/HibernateTraversableResolver.java +++ b/hibernate-core/src/main/java/org/hibernate/boot/beanvalidation/HibernateTraversableResolver.java @@ -34,8 +34,8 @@ public class HibernateTraversableResolver implements TraversableResolver { private final Map, Set> associationsPerEntityClass = new HashMap<>(); public void addPersister(EntityPersister persister, SessionFactoryImplementor factory) { - Class javaTypeClass = persister.getEntityMappingType().getMappedJavaType().getJavaTypeClass(); - Set associations = new HashSet<>(); + final var javaTypeClass = persister.getEntityMappingType().getMappedJavaType().getJavaTypeClass(); + final Set associations = new HashSet<>(); addAssociationsToTheSetForAllProperties( persister.getPropertyNames(), persister.getPropertyTypes(), "", factory, associations ); associationsPerEntityClass.put( javaTypeClass, associations ); } @@ -69,8 +69,8 @@ else if ( type instanceof ComponentType componentType ) { } private String getStringBasedPath(Path.Node traversableProperty, Path pathToTraversableObject) { - final StringBuilder path = new StringBuilder( ); - for ( Path.Node node : pathToTraversableObject ) { + final var path = new StringBuilder( ); + for ( var node : pathToTraversableObject ) { if (node.getName() != null) { path.append( node.getName() ).append( '.' ); } @@ -99,10 +99,8 @@ public boolean isCascadable(Object traversableObject, Class rootBeanType, Path pathToTraversableObject, ElementType elementType) { - Set associations = associationsPerEntityClass.get( rootBeanType); - if ( associations == null ) { - return false; - } - return !associations.contains( getStringBasedPath( traversableProperty, pathToTraversableObject ) ); + final var associations = associationsPerEntityClass.get( rootBeanType); + return associations != null + && !associations.contains( getStringBasedPath( traversableProperty, pathToTraversableObject ) ); } } diff --git a/hibernate-core/src/main/java/org/hibernate/boot/beanvalidation/TypeSafeActivator.java b/hibernate-core/src/main/java/org/hibernate/boot/beanvalidation/TypeSafeActivator.java index 9605b22cf749..8c35cd8789ea 100644 --- a/hibernate-core/src/main/java/org/hibernate/boot/beanvalidation/TypeSafeActivator.java +++ b/hibernate-core/src/main/java/org/hibernate/boot/beanvalidation/TypeSafeActivator.java @@ -9,7 +9,6 @@ import java.lang.reflect.Method; import java.util.Collection; import java.util.HashMap; -import java.util.HashSet; import java.util.Locale; import java.util.Map; import java.util.Set; @@ -23,6 +22,7 @@ import jakarta.validation.constraints.NotNull; import jakarta.validation.constraints.Size; import org.hibernate.AssertionFailure; +import org.hibernate.boot.beanvalidation.GroupsPerOperation.Operation; import org.hibernate.boot.internal.ClassLoaderAccessImpl; import org.hibernate.boot.registry.classloading.spi.ClassLoaderService; import org.hibernate.boot.registry.classloading.spi.ClassLoadingException; @@ -33,7 +33,6 @@ import org.hibernate.engine.config.spi.StandardConverters; import org.hibernate.engine.jdbc.spi.JdbcServices; import org.hibernate.engine.spi.SessionFactoryImplementor; -import org.hibernate.event.service.spi.EventListenerRegistry; import org.hibernate.event.spi.EventType; import org.hibernate.internal.CoreLogging; import org.hibernate.internal.CoreMessageLogger; @@ -42,18 +41,15 @@ import org.hibernate.mapping.Component; import org.hibernate.mapping.PersistentClass; import org.hibernate.mapping.Property; -import org.hibernate.mapping.Selectable; import org.hibernate.mapping.SingleTableSubclass; import org.hibernate.service.spi.SessionFactoryServiceRegistry; import jakarta.validation.Validation; import jakarta.validation.ValidatorFactory; -import jakarta.validation.metadata.BeanDescriptor; import jakarta.validation.metadata.ConstraintDescriptor; import jakarta.validation.metadata.PropertyDescriptor; -import static java.util.Arrays.asList; import static java.util.Collections.disjoint; import static org.hibernate.boot.beanvalidation.BeanValidationIntegrator.APPLY_CONSTRAINTS; import static org.hibernate.boot.beanvalidation.GroupsPerOperation.buildGroupsForOperation; @@ -93,16 +89,16 @@ public static void activate(ActivationContext context) { try { factory = getValidatorFactory( context ); } - catch (IntegrationException e) { - final Set validationModes = context.getValidationModes(); + catch (IntegrationException exception) { + final var validationModes = context.getValidationModes(); if ( validationModes.contains( ValidationMode.CALLBACK ) ) { - throw new IntegrationException( "Jakarta Validation provider was not available, but 'callback' validation mode was requested", e ); + throw new IntegrationException( "Jakarta Validation provider was not available, but 'callback' validation mode was requested", exception ); } else if ( validationModes.contains( ValidationMode.DDL ) ) { - throw new IntegrationException( "Jakarta Validation provider was not available, but 'ddl' validation mode was requested", e ); + throw new IntegrationException( "Jakarta Validation provider was not available, but 'ddl' validation mode was requested", exception ); } else { - if ( e.getCause() != null && e.getCause() instanceof NoProviderFoundException ) { + if ( exception.getCause() != null && exception.getCause() instanceof NoProviderFoundException ) { // all good, we are looking at the ValidationMode.AUTO, and there are no providers available. // Hence, we just don't enable the Jakarta Validation integration: LOG.debug( "Unable to acquire Jakarta Validation ValidatorFactory, skipping activation" ); @@ -111,7 +107,7 @@ else if ( validationModes.contains( ValidationMode.DDL ) ) { else { // There is a Jakarta Validation provider, but it failed to bootstrap the factory for some reason, // we should fail and let the user deal with it: - throw e; + throw exception; } } @@ -129,7 +125,7 @@ public static void applyCallbackListeners(ValidatorFactory validatorFactory, Act } private static boolean isValidationEnabled(ActivationContext context) { - final Set modes = context.getValidationModes(); + final var modes = context.getValidationModes(); return modes.contains( ValidationMode.CALLBACK ) || modes.contains( ValidationMode.AUTO ); } @@ -150,12 +146,15 @@ private static boolean isCheckNullabilityExplicit(ActivationContext context) { .getSettings().get( CHECK_NULLABILITY ) == null; } - private static void setupListener(ValidatorFactory validatorFactory, SessionFactoryServiceRegistry serviceRegistry, SessionFactoryImplementor sessionFactory) { - final ClassLoaderService classLoaderService = serviceRegistry.requireService( ClassLoaderService.class ); - final ConfigurationService cfgService = serviceRegistry.requireService( ConfigurationService.class ); - final BeanValidationEventListener listener = + private static void setupListener( + ValidatorFactory validatorFactory, + SessionFactoryServiceRegistry serviceRegistry, + SessionFactoryImplementor sessionFactory) { + final var classLoaderService = serviceRegistry.requireService( ClassLoaderService.class ); + final var cfgService = serviceRegistry.requireService( ConfigurationService.class ); + final var listener = new BeanValidationEventListener( validatorFactory, cfgService.getSettings(), classLoaderService ); - final EventListenerRegistry listenerRegistry = sessionFactory.getEventListenerRegistry(); + final var listenerRegistry = sessionFactory.getEventListenerRegistry(); listenerRegistry.addDuplicationStrategy( DuplicationStrategyImpl.INSTANCE ); listenerRegistry.appendListeners( EventType.PRE_INSERT, listener ); listenerRegistry.appendListeners( EventType.PRE_UPDATE, listener ); @@ -168,7 +167,7 @@ private static void setupListener(ValidatorFactory validatorFactory, SessionFact private static boolean isConstraintBasedValidationEnabled(ActivationContext context) { if ( context.getServiceRegistry().requireService( ConfigurationService.class ) .getSetting( APPLY_CONSTRAINTS, StandardConverters.BOOLEAN, true ) ) { - final Set modes = context.getValidationModes(); + final var modes = context.getValidationModes(); return modes.contains( ValidationMode.DDL ) || modes.contains( ValidationMode.AUTO ); } @@ -180,7 +179,7 @@ private static boolean isConstraintBasedValidationEnabled(ActivationContext cont private static void applyRelationalConstraints(ValidatorFactory factory, ActivationContext context) { if ( isConstraintBasedValidationEnabled( context ) ) { - final SessionFactoryServiceRegistry serviceRegistry = context.getServiceRegistry(); + final var serviceRegistry = context.getServiceRegistry(); applyRelationalConstraints( factory, context.getMetadata().getEntityBindings(), @@ -197,20 +196,17 @@ public static void applyRelationalConstraints( Map settings, Dialect dialect, ClassLoaderAccess classLoaderAccess) { - final Class[] groupsArray = - buildGroupsForOperation( GroupsPerOperation.Operation.DDL, settings, classLoaderAccess ); - final Set> groups = new HashSet<>( asList( groupsArray ) ); + final var groups = Set.of( buildGroupsForOperation( Operation.DDL, settings, classLoaderAccess ) ); final Map, Boolean> constraintCompositionTypeCache = new HashMap<>(); - - for ( PersistentClass persistentClass : persistentClasses ) { + for ( var persistentClass : persistentClasses ) { final String className = persistentClass.getClassName(); if ( isNotEmpty( className ) ) { - final Class clazz = entityClass( classLoaderAccess, className ); + final var entityClass = entityClass( classLoaderAccess, className ); try { applyDDL( "", persistentClass, - clazz, + entityClass, factory, groups, true, @@ -244,26 +240,27 @@ private static void applyDDL( Dialect dialect, Map, Boolean> constraintCompositionTypeCache ) { - final BeanDescriptor descriptor = factory.getValidator().getConstraintsForClass( clazz ); + final var beanDescriptor = factory.getValidator().getConstraintsForClass( clazz ); //cno bean level constraints can be applied, go to the properties - for ( PropertyDescriptor propertyDesc : descriptor.getConstrainedProperties() ) { - final Property property = - findPropertyByName( persistentClass, prefix + propertyDesc.getPropertyName() ); + for ( var propertyDescriptor : beanDescriptor.getConstrainedProperties() ) { + final var property = + findPropertyByName( persistentClass, + prefix + propertyDescriptor.getPropertyName() ); if ( property != null ) { final boolean hasNotNull = applyConstraints( - propertyDesc.getConstraintDescriptors(), + propertyDescriptor.getConstraintDescriptors(), property, - propertyDesc, + propertyDescriptor, groups, activateNotNull, false, dialect, constraintCompositionTypeCache ); - if ( property.isComposite() && propertyDesc.isCascaded() ) { - final Component component = (Component) property.getValue(); + if ( property.isComposite() && propertyDescriptor.isCascaded() ) { + final var component = (Component) property.getValue(); applyDDL( - prefix + propertyDesc.getPropertyName() + ".", + prefix + propertyDescriptor.getPropertyName() + ".", persistentClass, component.getComponentClass(), factory, @@ -292,33 +289,33 @@ private static boolean applyConstraints( boolean firstItem = true; boolean composedResultHasNotNull = false; - for ( ConstraintDescriptor descriptor : constraintDescriptors ) { + for ( var constraintDescriptor : constraintDescriptors ) { boolean hasNotNull = false; - if ( groups == null || !disjoint( descriptor.getGroups(), groups ) ) { + if ( groups == null || !disjoint( constraintDescriptor.getGroups(), groups ) ) { if ( canApplyNotNull ) { - hasNotNull = isNotNullDescriptor( descriptor ); + hasNotNull = isNotNullDescriptor( constraintDescriptor ); } // apply bean validation specific constraints - applyDigits( property, descriptor ); - applySize( property, descriptor, propertyDesc ); - applyMin( property, descriptor, dialect ); - applyMax( property, descriptor, dialect ); + applyDigits( property, constraintDescriptor ); + applySize( property, constraintDescriptor, propertyDesc ); + applyMin( property, constraintDescriptor, dialect ); + applyMax( property, constraintDescriptor, dialect ); // Apply Hibernate Validator specific constraints - we cannot import any HV specific classes though! // No need to check explicitly for @Range. @Range is a composed constraint using @Min and @Max which // will be taken care of later. - applyLength( property, descriptor, propertyDesc ); + applyLength( property, constraintDescriptor, propertyDesc ); // Composing constraints - if ( !descriptor.getComposingConstraints().isEmpty() ) { + if ( !constraintDescriptor.getComposingConstraints().isEmpty() ) { // pass an empty set as composing constraints inherit the main constraint and thus are matching already final boolean hasNotNullFromComposingConstraints = applyConstraints( - descriptor.getComposingConstraints(), + constraintDescriptor.getComposingConstraints(), property, propertyDesc, null, canApplyNotNull, - isConstraintCompositionOfTypeOr( descriptor, constraintCompositionTypeCache ), + isConstraintCompositionOfTypeOr( constraintDescriptor, constraintCompositionTypeCache ), dialect, constraintCompositionTypeCache ); @@ -351,30 +348,30 @@ else if ( !useOrLogicForComposedConstraint ) { private static boolean isConstraintCompositionOfTypeOr( ConstraintDescriptor descriptor, - Map, Boolean> constraintCompositionTypeCache - ) { + Map, Boolean> constraintCompositionTypeCache) { if ( descriptor.getComposingConstraints().size() < 2 ) { return false; } - - final var composedAnnotation = descriptor.getAnnotation().annotationType(); - return constraintCompositionTypeCache.computeIfAbsent( composedAnnotation, value -> { - for ( Annotation annotation : value.getAnnotations() ) { - if ( "org.hibernate.validator.constraints.ConstraintComposition" - .equals( annotation.annotationType().getName() ) ) { - try { - Method valueMethod = annotation.annotationType().getMethod( "value" ); - Object result = valueMethod.invoke( annotation ); - return result != null && "OR".equals( result.toString() ); - } - catch ( NoSuchMethodException | IllegalAccessException | InvocationTargetException ex ) { - LOG.debug( "ConstraintComposition type could not be determined. Assuming AND", ex ); - return false; + else { + final var composedAnnotation = descriptor.getAnnotation().annotationType(); + return constraintCompositionTypeCache.computeIfAbsent( composedAnnotation, value -> { + for ( var annotation : value.getAnnotations() ) { + if ( "org.hibernate.validator.constraints.ConstraintComposition" + .equals( annotation.annotationType().getName() ) ) { + try { + final Method valueMethod = annotation.annotationType().getMethod( "value" ); + final Object result = valueMethod.invoke( annotation ); + return result != null && "OR".equals( result.toString() ); + } + catch (NoSuchMethodException | IllegalAccessException | InvocationTargetException ex) { + LOG.debug( "ConstraintComposition type could not be determined. Assuming AND", ex ); + return false; + } } } - } - return false; - }); + return false; + } ); + } } private static void applyMin(Property property, ConstraintDescriptor descriptor, Dialect dialect) { @@ -382,7 +379,7 @@ private static void applyMin(Property property, ConstraintDescriptor descript @SuppressWarnings("unchecked") final var minConstraint = (ConstraintDescriptor) descriptor; final long min = minConstraint.getAnnotation().value(); - for ( Selectable selectable : property.getSelectables() ) { + for ( var selectable : property.getSelectables() ) { if ( selectable instanceof Column column ) { applySQLCheck( column, column.getQuotedName( dialect ) + ">=" + min ); } @@ -395,7 +392,7 @@ private static void applyMax(Property property, ConstraintDescriptor descript @SuppressWarnings("unchecked") final var maxConstraint = (ConstraintDescriptor) descriptor; final long max = maxConstraint.getAnnotation().value(); - for ( Selectable selectable : property.getSelectables() ) { + for ( var selectable : property.getSelectables() ) { if ( selectable instanceof Column column ) { applySQLCheck( column, column.getQuotedName( dialect ) + "<=" + max ); } @@ -406,8 +403,8 @@ private static void applyMax(Property property, ConstraintDescriptor descript private static void applySQLCheck(Column column, String checkConstraint) { // need to check whether the new check is already part of the existing check, // because applyDDL can be called multiple times - for ( CheckConstraint constraint : column.getCheckConstraints() ) { - if ( constraint.getConstraint().equalsIgnoreCase( checkConstraint ) ) { + for ( var columnCheckConstraint : column.getCheckConstraints() ) { + if ( columnCheckConstraint.getConstraint().equalsIgnoreCase( checkConstraint ) ) { return; //EARLY EXIT } } @@ -415,7 +412,7 @@ private static void applySQLCheck(Column column, String checkConstraint) { } private static boolean isNotNullDescriptor(ConstraintDescriptor descriptor) { - final Class annotationType = descriptor.getAnnotation().annotationType(); + final var annotationType = descriptor.getAnnotation().annotationType(); return NotNull.class.equals(annotationType) || NotEmpty.class.equals(annotationType) || NotBlank.class.equals(annotationType); @@ -427,7 +424,7 @@ private static void markNotNull(Property property) { // composite should not add not-null on all columns if ( !property.isComposite() ) { property.setOptional( false ); - for ( Selectable selectable : property.getSelectables() ) { + for ( var selectable : property.getSelectables() ) { if ( selectable instanceof Column column ) { column.setNullable( false ); } @@ -450,7 +447,7 @@ private static void applyDigits(Property property, ConstraintDescriptor descr final var digitsConstraint = (ConstraintDescriptor) descriptor; final int integerDigits = digitsConstraint.getAnnotation().integer(); final int fractionalDigits = digitsConstraint.getAnnotation().fraction(); - for ( Selectable selectable : property.getSelectables() ) { + for ( var selectable : property.getSelectables() ) { if ( selectable instanceof Column column ) { column.setPrecision( integerDigits + fractionalDigits ); column.setScale( fractionalDigits ); @@ -466,9 +463,9 @@ private static void applySize(Property property, ConstraintDescriptor descrip @SuppressWarnings("unchecked") final var sizeConstraint = (ConstraintDescriptor) descriptor; final int max = sizeConstraint.getAnnotation().max(); - for ( Column col : property.getColumns() ) { + for ( var column : property.getColumns() ) { if ( max < Integer.MAX_VALUE ) { - col.setLength( max ); + column.setLength( max ); } } } @@ -478,7 +475,7 @@ private static void applyLength(Property property, ConstraintDescriptor descr if ( isValidatorLengthAnnotation( descriptor ) && String.class.equals( propertyDescriptor.getElementClass() ) ) { final int max = (Integer) descriptor.getAttributes().get( "max" ); - for ( Selectable selectable : property.getSelectables() ) { + for ( var selectable : property.getSelectables() ) { if ( selectable instanceof Column column ) { if ( max < Integer.MAX_VALUE ) { column.setLength( max ); @@ -502,14 +499,14 @@ private static ValidatorFactory getValidatorFactory(ActivationContext context) { // 3) build a new ValidatorFactory // 1 - look in SessionFactoryOptions.getValidatorFactoryReference() - final ValidatorFactory providedFactory = + final var providedFactory = resolveProvidedFactory( context.getSessionFactory().getSessionFactoryOptions() ); if ( providedFactory != null ) { return providedFactory; } // 2 - look in ConfigurationService - final ValidatorFactory configuredFactory = + final var configuredFactory = resolveProvidedFactory( context.getServiceRegistry().requireService( ConfigurationService.class ) ); if ( configuredFactory != null ) { return configuredFactory; diff --git a/hibernate-core/src/main/java/org/hibernate/boot/beanvalidation/ValidationMode.java b/hibernate-core/src/main/java/org/hibernate/boot/beanvalidation/ValidationMode.java index bee3c22bb062..13c774249483 100644 --- a/hibernate-core/src/main/java/org/hibernate/boot/beanvalidation/ValidationMode.java +++ b/hibernate-core/src/main/java/org/hibernate/boot/beanvalidation/ValidationMode.java @@ -70,12 +70,14 @@ public static String loggable(Set modes) { if ( modes == null || modes.isEmpty() ) { return "[]"; } - final StringBuilder result = new StringBuilder( "[" ); - String sep = ""; - for ( ValidationMode mode : modes ) { - result.append( sep ).append( mode.externalForm() ); - sep = ", "; + else { + final var result = new StringBuilder( "[" ); + String sep = ""; + for ( var mode : modes ) { + result.append( sep ).append( mode.externalForm() ); + sep = ", "; + } + return result.append( "]" ).toString(); } - return result.append( "]" ).toString(); } } 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 addd2788ceda..c17b283832bb 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 @@ -258,7 +258,6 @@ public class SessionFactoryOptionsBuilder implements SessionFactoryOptions { @Deprecated(forRemoval = true) private boolean releaseResourcesOnCloseEnabled; - @SuppressWarnings( "unchecked" ) public SessionFactoryOptionsBuilder(StandardServiceRegistry serviceRegistry, BootstrapContext context) { this.serviceRegistry = serviceRegistry; jpaBootstrap = context.isJpaBootstrap(); @@ -1700,14 +1699,14 @@ public CacheRetrieveMode getCacheRetrieveMode(Map properties) { } private static CacheRetrieveMode defaultCacheRetrieveMode(Map settings) { - final CacheRetrieveMode cacheRetrieveMode = (CacheRetrieveMode) settings.get( JPA_SHARED_CACHE_RETRIEVE_MODE ); + final var cacheRetrieveMode = (CacheRetrieveMode) settings.get( JPA_SHARED_CACHE_RETRIEVE_MODE ); return cacheRetrieveMode == null ? (CacheRetrieveMode) settings.get( JAKARTA_SHARED_CACHE_RETRIEVE_MODE ) : cacheRetrieveMode; } private static CacheStoreMode defaultCacheStoreMode(Map settings) { - final CacheStoreMode cacheStoreMode = (CacheStoreMode) settings.get( JPA_SHARED_CACHE_STORE_MODE ); + final var cacheStoreMode = (CacheStoreMode) settings.get( JPA_SHARED_CACHE_STORE_MODE ); return cacheStoreMode == null ? (CacheStoreMode) settings.get( JAKARTA_SHARED_CACHE_STORE_MODE ) : cacheStoreMode; @@ -1733,7 +1732,7 @@ private static FlushMode defaultFlushMode(Map properties) { } private static LockOptions defaultLockOptions(Map defaultSessionProperties) { - final LockOptions lockOptions = new LockOptions(); + final var lockOptions = new LockOptions(); applyPropertiesToLockOptions( defaultSessionProperties, () -> lockOptions ); return lockOptions; } diff --git a/hibernate-core/src/main/java/org/hibernate/context/internal/JTASessionContext.java b/hibernate-core/src/main/java/org/hibernate/context/internal/JTASessionContext.java index 26b00726bb1c..4842bf36aaba 100644 --- a/hibernate-core/src/main/java/org/hibernate/context/internal/JTASessionContext.java +++ b/hibernate-core/src/main/java/org/hibernate/context/internal/JTASessionContext.java @@ -8,20 +8,20 @@ import java.util.concurrent.ConcurrentHashMap; import jakarta.transaction.Synchronization; import jakarta.transaction.Transaction; -import jakarta.transaction.TransactionManager; import org.hibernate.FlushMode; import org.hibernate.HibernateException; import org.hibernate.Session; import org.hibernate.context.spi.AbstractCurrentSessionContext; import org.hibernate.engine.spi.SessionFactoryImplementor; -import org.hibernate.engine.transaction.internal.jta.JtaStatusHelper; import org.hibernate.engine.transaction.jta.platform.spi.JtaPlatform; import org.hibernate.internal.CoreLogging; import org.hibernate.internal.CoreMessageLogger; import org.hibernate.resource.jdbc.spi.PhysicalConnectionHandlingMode; +import static org.hibernate.engine.transaction.internal.jta.JtaStatusHelper.isActive; + /** * An implementation of {@link org.hibernate.context.spi.CurrentSessionContext} which scopes the notion * of a current session to a JTA transaction. Because JTA gives us a nice tie-in to clean up after @@ -59,8 +59,8 @@ public JTASessionContext(SessionFactoryImplementor factory) { @Override public Session currentSession() throws HibernateException { - final JtaPlatform jtaPlatform = factory().getServiceRegistry().requireService( JtaPlatform.class ); - final TransactionManager transactionManager = jtaPlatform.retrieveTransactionManager(); + final var jtaPlatform = factory().getServiceRegistry().requireService( JtaPlatform.class ); + final var transactionManager = jtaPlatform.retrieveTransactionManager(); if ( transactionManager == null ) { throw new HibernateException( "No TransactionManagerLookup specified" ); } @@ -71,7 +71,7 @@ public Session currentSession() throws HibernateException { if ( txn == null ) { throw new HibernateException( "Unable to locate current JTA transaction" ); } - if ( !JtaStatusHelper.isActive( txn.getStatus() ) ) { + if ( !isActive( txn.getStatus() ) ) { // We could register the session against the transaction even though it is // not started, but we'd have no guarantee of ever getting the map // entries cleaned up (aside from spawning threads). diff --git a/hibernate-core/src/main/java/org/hibernate/engine/transaction/internal/jta/JtaStatusHelper.java b/hibernate-core/src/main/java/org/hibernate/engine/transaction/internal/jta/JtaStatusHelper.java index 3a2fecc063c7..a118009b6ce9 100644 --- a/hibernate-core/src/main/java/org/hibernate/engine/transaction/internal/jta/JtaStatusHelper.java +++ b/hibernate-core/src/main/java/org/hibernate/engine/transaction/internal/jta/JtaStatusHelper.java @@ -107,9 +107,9 @@ public static boolean isActive(TransactionManager transactionManager) { * @return True if the code indicates a roll back; false otherwise. */ public static boolean isRollback(int status) { - return status == Status.STATUS_MARKED_ROLLBACK || - status == Status.STATUS_ROLLING_BACK || - status == Status.STATUS_ROLLEDBACK; + return status == Status.STATUS_MARKED_ROLLBACK + || status == Status.STATUS_ROLLING_BACK + || status == Status.STATUS_ROLLEDBACK; } /** diff --git a/hibernate-core/src/main/java/org/hibernate/engine/transaction/jta/platform/internal/AbstractJtaPlatform.java b/hibernate-core/src/main/java/org/hibernate/engine/transaction/jta/platform/internal/AbstractJtaPlatform.java index d66eb7196737..78543841e9ee 100644 --- a/hibernate-core/src/main/java/org/hibernate/engine/transaction/jta/platform/internal/AbstractJtaPlatform.java +++ b/hibernate-core/src/main/java/org/hibernate/engine/transaction/jta/platform/internal/AbstractJtaPlatform.java @@ -12,7 +12,6 @@ import jakarta.transaction.UserTransaction; import org.hibernate.engine.jndi.spi.JndiService; -import org.hibernate.engine.transaction.internal.jta.JtaStatusHelper; import org.hibernate.engine.transaction.jta.platform.spi.JtaPlatform; import org.hibernate.engine.transaction.jta.platform.spi.JtaPlatformException; import org.hibernate.service.ServiceRegistry; @@ -22,6 +21,7 @@ import static org.hibernate.cfg.TransactionSettings.JTA_CACHE_TM; import static org.hibernate.cfg.TransactionSettings.JTA_CACHE_UT; +import static org.hibernate.engine.transaction.internal.jta.JtaStatusHelper.isActive; import static org.hibernate.internal.util.config.ConfigurationHelper.getBoolean; /** @@ -54,7 +54,7 @@ public void registerSynchronization(Synchronization synchronization) { @Override public boolean canRegisterSynchronization() { - return JtaStatusHelper.isActive( getTransactionManager() ); + return isActive( getTransactionManager() ); } } diff --git a/hibernate-core/src/main/java/org/hibernate/engine/transaction/jta/platform/internal/SynchronizationRegistryBasedSynchronizationStrategy.java b/hibernate-core/src/main/java/org/hibernate/engine/transaction/jta/platform/internal/SynchronizationRegistryBasedSynchronizationStrategy.java index cd97182b90f0..33eeedfd7269 100644 --- a/hibernate-core/src/main/java/org/hibernate/engine/transaction/jta/platform/internal/SynchronizationRegistryBasedSynchronizationStrategy.java +++ b/hibernate-core/src/main/java/org/hibernate/engine/transaction/jta/platform/internal/SynchronizationRegistryBasedSynchronizationStrategy.java @@ -7,7 +7,7 @@ import jakarta.transaction.Synchronization; import jakarta.transaction.TransactionSynchronizationRegistry; -import org.hibernate.engine.transaction.internal.jta.JtaStatusHelper; +import static org.hibernate.engine.transaction.internal.jta.JtaStatusHelper.isActive; /** * Implementation of the {@link JtaSynchronizationStrategy} contract based on using a @@ -24,14 +24,14 @@ public SynchronizationRegistryBasedSynchronizationStrategy(SynchronizationRegist @Override public void registerSynchronization(Synchronization synchronization) { - synchronizationRegistryAccess.getSynchronizationRegistry().registerInterposedSynchronization( - synchronization - ); + synchronizationRegistryAccess.getSynchronizationRegistry() + .registerInterposedSynchronization( synchronization ); } @Override public boolean canRegisterSynchronization() { - final TransactionSynchronizationRegistry registry = synchronizationRegistryAccess.getSynchronizationRegistry(); - return JtaStatusHelper.isActive( registry.getTransactionStatus() ) && ! registry.getRollbackOnly(); + final var registry = synchronizationRegistryAccess.getSynchronizationRegistry(); + return isActive( registry.getTransactionStatus() ) + && !registry.getRollbackOnly(); } } diff --git a/hibernate-core/src/main/java/org/hibernate/event/service/spi/EventListenerGroup.java b/hibernate-core/src/main/java/org/hibernate/event/service/spi/EventListenerGroup.java index d8a777a11193..f24ea212c680 100644 --- a/hibernate-core/src/main/java/org/hibernate/event/service/spi/EventListenerGroup.java +++ b/hibernate-core/src/main/java/org/hibernate/event/service/spi/EventListenerGroup.java @@ -55,10 +55,26 @@ public interface EventListenerGroup { */ void addDuplicationStrategy(DuplicationStrategy strategy); + /** + * Add a listener to the group. + */ void appendListener(T listener); + + /** + * Add the given listeners to the group. + */ + @SuppressWarnings("unchecked") // heap pollution due to varargs void appendListeners(T... listeners); + /** + * Add a listener to the group. + */ void prependListener(T listener); + + /** + * Add the given listeners to the group. + */ + @SuppressWarnings("unchecked") // heap pollution due to varargs void prependListeners(T... listeners); /** diff --git a/hibernate-core/src/main/java/org/hibernate/event/service/spi/EventListenerGroups.java b/hibernate-core/src/main/java/org/hibernate/event/service/spi/EventListenerGroups.java index 9166fc7e7d5c..53896f8e9211 100644 --- a/hibernate-core/src/main/java/org/hibernate/event/service/spi/EventListenerGroups.java +++ b/hibernate-core/src/main/java/org/hibernate/event/service/spi/EventListenerGroups.java @@ -41,6 +41,8 @@ import java.util.Objects; +import static org.hibernate.event.spi.EventType.*; + /** * Holds the {@link org.hibernate.event.spi event} listener groups for the various event types. * @@ -100,45 +102,39 @@ public EventListenerGroups(ServiceRegistry serviceRegistry) { // Pre-compute all iterators on Event listeners: - this.eventListenerGroup_AUTO_FLUSH = listeners( eventListenerRegistry, EventType.AUTO_FLUSH ); - this.eventListenerGroup_CLEAR = listeners( eventListenerRegistry, EventType.CLEAR ); - this.eventListenerGroup_DELETE = listeners( eventListenerRegistry, EventType.DELETE ); - this.eventListenerGroup_DIRTY_CHECK = listeners( eventListenerRegistry, EventType.DIRTY_CHECK ); - this.eventListenerGroup_EVICT = listeners( eventListenerRegistry, EventType.EVICT ); - this.eventListenerGroup_FLUSH = listeners( eventListenerRegistry, EventType.FLUSH ); - this.eventListenerGroup_FLUSH_ENTITY = listeners( eventListenerRegistry, EventType.FLUSH_ENTITY ); - this.eventListenerGroup_INIT_COLLECTION = listeners( eventListenerRegistry, EventType.INIT_COLLECTION ); - this.eventListenerGroup_LOAD = listeners( eventListenerRegistry, EventType.LOAD ); - this.eventListenerGroup_LOCK = listeners( eventListenerRegistry, EventType.LOCK ); - this.eventListenerGroup_MERGE = listeners( eventListenerRegistry, EventType.MERGE ); - this.eventListenerGroup_PERSIST = listeners( eventListenerRegistry, EventType.PERSIST ); - this.eventListenerGroup_PERSIST_ONFLUSH = listeners( eventListenerRegistry, EventType.PERSIST_ONFLUSH ); - this.eventListenerGroup_POST_COLLECTION_RECREATE = listeners( eventListenerRegistry, - EventType.POST_COLLECTION_RECREATE ); - this.eventListenerGroup_POST_COLLECTION_REMOVE = listeners( eventListenerRegistry, - EventType.POST_COLLECTION_REMOVE ); - this.eventListenerGroup_POST_COLLECTION_UPDATE = listeners( eventListenerRegistry, - EventType.POST_COLLECTION_UPDATE ); - this.eventListenerGroup_POST_COMMIT_DELETE = listeners( eventListenerRegistry, EventType.POST_COMMIT_DELETE ); - this.eventListenerGroup_POST_COMMIT_INSERT = listeners( eventListenerRegistry, EventType.POST_COMMIT_INSERT ); - this.eventListenerGroup_POST_COMMIT_UPDATE = listeners( eventListenerRegistry, EventType.POST_COMMIT_UPDATE ); - this.eventListenerGroup_POST_DELETE = listeners( eventListenerRegistry, EventType.POST_DELETE ); - this.eventListenerGroup_POST_INSERT = listeners( eventListenerRegistry, EventType.POST_INSERT ); - this.eventListenerGroup_POST_LOAD = listeners( eventListenerRegistry, EventType.POST_LOAD ); - this.eventListenerGroup_POST_UPDATE = listeners( eventListenerRegistry, EventType.POST_UPDATE ); - this.eventListenerGroup_POST_UPSERT = listeners( eventListenerRegistry, EventType.POST_UPSERT ); - this.eventListenerGroup_PRE_COLLECTION_RECREATE = listeners( eventListenerRegistry, - EventType.PRE_COLLECTION_RECREATE ); - this.eventListenerGroup_PRE_COLLECTION_REMOVE = listeners( eventListenerRegistry, - EventType.PRE_COLLECTION_REMOVE ); - this.eventListenerGroup_PRE_COLLECTION_UPDATE = listeners( eventListenerRegistry, - EventType.PRE_COLLECTION_UPDATE ); - this.eventListenerGroup_PRE_DELETE = listeners( eventListenerRegistry, EventType.PRE_DELETE ); - this.eventListenerGroup_PRE_INSERT = listeners( eventListenerRegistry, EventType.PRE_INSERT ); - this.eventListenerGroup_PRE_LOAD = listeners( eventListenerRegistry, EventType.PRE_LOAD ); - this.eventListenerGroup_PRE_UPDATE = listeners( eventListenerRegistry, EventType.PRE_UPDATE ); - this.eventListenerGroup_PRE_UPSERT = listeners( eventListenerRegistry, EventType.PRE_UPSERT ); - this.eventListenerGroup_REFRESH = listeners( eventListenerRegistry, EventType.REFRESH ); - this.eventListenerGroup_REPLICATE = listeners( eventListenerRegistry, EventType.REPLICATE ); + eventListenerGroup_AUTO_FLUSH = listeners( eventListenerRegistry, AUTO_FLUSH ); + eventListenerGroup_CLEAR = listeners( eventListenerRegistry, CLEAR ); + eventListenerGroup_DELETE = listeners( eventListenerRegistry, DELETE ); + eventListenerGroup_DIRTY_CHECK = listeners( eventListenerRegistry, DIRTY_CHECK ); + eventListenerGroup_EVICT = listeners( eventListenerRegistry, EVICT ); + eventListenerGroup_FLUSH = listeners( eventListenerRegistry, FLUSH ); + eventListenerGroup_FLUSH_ENTITY = listeners( eventListenerRegistry, FLUSH_ENTITY ); + eventListenerGroup_INIT_COLLECTION = listeners( eventListenerRegistry, INIT_COLLECTION ); + eventListenerGroup_LOAD = listeners( eventListenerRegistry, LOAD ); + eventListenerGroup_LOCK = listeners( eventListenerRegistry, LOCK ); + eventListenerGroup_MERGE = listeners( eventListenerRegistry, MERGE ); + eventListenerGroup_PERSIST = listeners( eventListenerRegistry, PERSIST ); + eventListenerGroup_PERSIST_ONFLUSH = listeners( eventListenerRegistry, PERSIST_ONFLUSH ); + eventListenerGroup_POST_COLLECTION_RECREATE = listeners( eventListenerRegistry, POST_COLLECTION_RECREATE ); + eventListenerGroup_POST_COLLECTION_REMOVE = listeners( eventListenerRegistry, POST_COLLECTION_REMOVE ); + eventListenerGroup_POST_COLLECTION_UPDATE = listeners( eventListenerRegistry, POST_COLLECTION_UPDATE ); + eventListenerGroup_POST_COMMIT_DELETE = listeners( eventListenerRegistry, POST_COMMIT_DELETE ); + eventListenerGroup_POST_COMMIT_INSERT = listeners( eventListenerRegistry, POST_COMMIT_INSERT ); + eventListenerGroup_POST_COMMIT_UPDATE = listeners( eventListenerRegistry, POST_COMMIT_UPDATE ); + eventListenerGroup_POST_DELETE = listeners( eventListenerRegistry, POST_DELETE ); + eventListenerGroup_POST_INSERT = listeners( eventListenerRegistry, POST_INSERT ); + eventListenerGroup_POST_LOAD = listeners( eventListenerRegistry, POST_LOAD ); + eventListenerGroup_POST_UPDATE = listeners( eventListenerRegistry, POST_UPDATE ); + eventListenerGroup_POST_UPSERT = listeners( eventListenerRegistry, POST_UPSERT ); + eventListenerGroup_PRE_COLLECTION_RECREATE = listeners( eventListenerRegistry, PRE_COLLECTION_RECREATE ); + eventListenerGroup_PRE_COLLECTION_REMOVE = listeners( eventListenerRegistry, PRE_COLLECTION_REMOVE ); + eventListenerGroup_PRE_COLLECTION_UPDATE = listeners( eventListenerRegistry, PRE_COLLECTION_UPDATE ); + eventListenerGroup_PRE_DELETE = listeners( eventListenerRegistry, PRE_DELETE ); + eventListenerGroup_PRE_INSERT = listeners( eventListenerRegistry, PRE_INSERT ); + eventListenerGroup_PRE_LOAD = listeners( eventListenerRegistry, PRE_LOAD ); + eventListenerGroup_PRE_UPDATE = listeners( eventListenerRegistry, PRE_UPDATE ); + eventListenerGroup_PRE_UPSERT = listeners( eventListenerRegistry, PRE_UPSERT ); + eventListenerGroup_REFRESH = listeners( eventListenerRegistry, REFRESH ); + eventListenerGroup_REPLICATE = listeners( eventListenerRegistry, REPLICATE ); } } diff --git a/hibernate-core/src/main/java/org/hibernate/event/service/spi/EventListenerRegistry.java b/hibernate-core/src/main/java/org/hibernate/event/service/spi/EventListenerRegistry.java index d5bcf7297b84..9c3ae0151d37 100644 --- a/hibernate-core/src/main/java/org/hibernate/event/service/spi/EventListenerRegistry.java +++ b/hibernate-core/src/main/java/org/hibernate/event/service/spi/EventListenerRegistry.java @@ -14,6 +14,7 @@ * * @author Steve Ebersole */ +@SuppressWarnings("unchecked") // heap pollution due to varargs public interface EventListenerRegistry extends Service { EventListenerGroup getEventListenerGroup(EventType eventType); diff --git a/hibernate-core/src/main/java/org/hibernate/event/spi/EventEngine.java b/hibernate-core/src/main/java/org/hibernate/event/spi/EventEngine.java index 2d233b784a27..132f708c589f 100644 --- a/hibernate-core/src/main/java/org/hibernate/event/spi/EventEngine.java +++ b/hibernate-core/src/main/java/org/hibernate/event/spi/EventEngine.java @@ -50,7 +50,7 @@ public EventEngine(MetadataImplementor mappings, SessionFactoryImplementor sessi // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ // resolve event types and listeners - final EventListenerRegistryImpl.Builder listenerRegistryBuilder = + final var listenerRegistryBuilder = new EventListenerRegistryImpl.Builder( callbackRegistry, sessionFactoryOptions.isJpaBootstrap() ); final Map> eventTypes = new HashMap<>(); @@ -64,7 +64,7 @@ public EventEngine(MetadataImplementor mappings, SessionFactoryImplementor sessi private static void callContributors( ServiceRegistryImplementor serviceRegistry, EventEngineContributions contributionManager) { - final Collection discoveredContributors = + final var discoveredContributors = serviceRegistry.requireService( ClassLoaderService.class ) .loadJavaServices( EventEngineContributor.class ); if ( isNotEmpty( discoveredContributors ) ) { @@ -117,7 +117,7 @@ public EventType findEventType(String name) { @Override public EventType contributeEventType(String name, Class listenerRole) { - final EventType eventType = registerEventType( name, listenerRole ); + final var eventType = registerEventType( name, listenerRole ); listenerRegistryBuilder.prepareListeners( eventType ); return eventType; } @@ -131,7 +131,7 @@ else if ( listenerRole == null ) { } // make sure it does not match an existing name... else if ( eventTypes.containsKey( name ) ) { - final EventType existing = eventTypes.get( name ); + final var existing = eventTypes.get( name ); throw new HibernateException( "Custom event-type already registered: " + name + " => " + existing ); @@ -146,7 +146,7 @@ else if ( eventTypes.containsKey( name ) ) { @Override @SafeVarargs public final EventType contributeEventType(String name, Class listenerRole, T... defaultListeners) { - final EventType eventType = contributeEventType( name, listenerRole ); + final var eventType = contributeEventType( name, listenerRole ); if ( defaultListeners != null ) { listenerRegistryBuilder.getListenerGroup( eventType ).appendListeners( defaultListeners ); } diff --git a/hibernate-core/src/main/java/org/hibernate/internal/StatelessSessionImpl.java b/hibernate-core/src/main/java/org/hibernate/internal/StatelessSessionImpl.java index 12ba470f9e3e..66c550464997 100644 --- a/hibernate-core/src/main/java/org/hibernate/internal/StatelessSessionImpl.java +++ b/hibernate-core/src/main/java/org/hibernate/internal/StatelessSessionImpl.java @@ -31,7 +31,6 @@ import org.hibernate.engine.spi.SessionImplementor; import org.hibernate.engine.spi.StatelessSessionImplementor; import org.hibernate.engine.spi.TransactionCompletionCallbacks; -import org.hibernate.engine.transaction.internal.jta.JtaStatusHelper; import org.hibernate.engine.transaction.jta.platform.spi.JtaPlatform; import org.hibernate.event.monitor.spi.DiagnosticEvent; import org.hibernate.event.service.spi.EventListenerGroups; @@ -85,6 +84,7 @@ import static org.hibernate.engine.internal.Versioning.incrementVersion; import static org.hibernate.engine.internal.Versioning.seedVersion; import static org.hibernate.engine.internal.Versioning.setVersion; +import static org.hibernate.engine.transaction.internal.jta.JtaStatusHelper.isRollback; import static org.hibernate.event.internal.DefaultInitializeCollectionEventListener.handlePotentiallyEmptyCollection; import static org.hibernate.generator.EventType.INSERT; import static org.hibernate.internal.util.NullnessUtil.castNonNull; @@ -1372,7 +1372,7 @@ private boolean shouldFlushBeforeCompletion() { try { return !isClosed() && !isFlushModeNever() - && !JtaStatusHelper.isRollback( getJtaPlatform().getCurrentStatus() ); + && !isRollback( getJtaPlatform().getCurrentStatus() ); } catch ( SystemException se ) { throw new HibernateException( "could not determine transaction status in beforeCompletion()", se ); diff --git a/hibernate-core/src/main/java/org/hibernate/jpa/boot/internal/ServiceRegistryCloser.java b/hibernate-core/src/main/java/org/hibernate/jpa/boot/internal/ServiceRegistryCloser.java index 4f44235d8bd7..bfd9d5ec2faf 100644 --- a/hibernate-core/src/main/java/org/hibernate/jpa/boot/internal/ServiceRegistryCloser.java +++ b/hibernate-core/src/main/java/org/hibernate/jpa/boot/internal/ServiceRegistryCloser.java @@ -22,11 +22,12 @@ public void sessionFactoryCreated(SessionFactory sessionFactory) { @Override public void sessionFactoryClosed(SessionFactory sessionFactory) { - final SessionFactoryImplementor factoryImplementor = (SessionFactoryImplementor) sessionFactory; - final ServiceRegistryImplementor serviceRegistry = factoryImplementor.getServiceRegistry(); + final var factoryImplementor = (SessionFactoryImplementor) sessionFactory; + final var serviceRegistry = factoryImplementor.getServiceRegistry(); serviceRegistry.destroy(); - final ServiceRegistryImplementor basicRegistry = - (ServiceRegistryImplementor) serviceRegistry.getParentServiceRegistry(); + final var basicRegistry = + (ServiceRegistryImplementor) + serviceRegistry.getParentServiceRegistry(); if ( basicRegistry != null ) { basicRegistry.destroy(); } diff --git a/hibernate-core/src/main/java/org/hibernate/jpa/internal/ExceptionMapperLegacyJpaImpl.java b/hibernate-core/src/main/java/org/hibernate/jpa/internal/ExceptionMapperLegacyJpaImpl.java index 0b9817b293b6..380567f4d060 100644 --- a/hibernate-core/src/main/java/org/hibernate/jpa/internal/ExceptionMapperLegacyJpaImpl.java +++ b/hibernate-core/src/main/java/org/hibernate/jpa/internal/ExceptionMapperLegacyJpaImpl.java @@ -30,9 +30,11 @@ public RuntimeException mapManagedFlushFailure(String message, RuntimeException if (failure instanceof HibernateException) { throw session.getExceptionConverter().convert( failure ); } - if (failure instanceof PersistenceException) { + else if (failure instanceof PersistenceException) { throw failure; } - throw new PersistenceException( message, failure ); + else { + throw new PersistenceException( message, failure ); + } } } diff --git a/hibernate-core/src/main/java/org/hibernate/jpa/internal/HintsCollector.java b/hibernate-core/src/main/java/org/hibernate/jpa/internal/HintsCollector.java index 3311b7aa10b4..2c12840de8e6 100644 --- a/hibernate-core/src/main/java/org/hibernate/jpa/internal/HintsCollector.java +++ b/hibernate-core/src/main/java/org/hibernate/jpa/internal/HintsCollector.java @@ -28,35 +28,27 @@ public static Set getDefinedHints() { private static Set buildHintsSet() { final HashSet hints = new HashSet<>(); - applyHints( hints, HibernateHints.class ); applyHints( hints, SpecHints.class ); - return unmodifiableSet( hints ); } private static void applyHints(HashSet hints, Class hintsClass) { - final Field[] fields = hintsClass.getDeclaredFields(); - for ( int i = 0; i < fields.length; i++ ) { - final Field field = fields[i]; - if ( !field.getName().startsWith( "HINT_" ) ) { - continue; - } - - if ( !field.getType().equals( String.class ) ) { - continue; + for ( final Field field : hintsClass.getDeclaredFields() ) { + if ( field.getName().startsWith( "HINT_" ) + && field.getType().equals( String.class ) ) { + // the field's value is the hint name + try { + hints.add( (String) field.get( hintsClass ) ); + } + catch (IllegalAccessException e) { + throw new HibernateException( + "Unable to generate set of all hints - " + hintsClass.getName(), + e + ); + } } - // the field's value is the hint name - try { - hints.add( (String) field.get( hintsClass ) ); - } - catch (IllegalAccessException e) { - throw new HibernateException( - "Unable to generate set of all hints - " + hintsClass.getName(), - e - ); - } } } } diff --git a/hibernate-core/src/main/java/org/hibernate/jpa/internal/JpaComplianceImpl.java b/hibernate-core/src/main/java/org/hibernate/jpa/internal/JpaComplianceImpl.java index 4a964a85fec5..fbc8e3f47dc4 100644 --- a/hibernate-core/src/main/java/org/hibernate/jpa/internal/JpaComplianceImpl.java +++ b/hibernate-core/src/main/java/org/hibernate/jpa/internal/JpaComplianceImpl.java @@ -9,37 +9,17 @@ /** * @author Andrea Boriero */ -public class JpaComplianceImpl implements JpaCompliance { - private final boolean orderByMappingCompliance; - private final boolean proxyCompliance; - private final boolean globalGeneratorNameScopeCompliance; - private final boolean queryCompliance; - private final boolean transactionCompliance; - private final boolean closedCompliance; - private final boolean cachingCompliance; - private final boolean loadByIdCompliance; - private final boolean cascadeCompliance; - - public JpaComplianceImpl( - boolean orderByMappingCompliance, - boolean proxyCompliance, - boolean globalGeneratorNameScopeCompliance, - boolean queryCompliance, - boolean transactionCompliance, - boolean closedCompliance, - boolean cachingCompliance, - boolean loadByIdCompliance, - boolean cascadeCompliance) { - this.queryCompliance = queryCompliance; - this.transactionCompliance = transactionCompliance; - this.closedCompliance = closedCompliance; - this.proxyCompliance = proxyCompliance; - this.cachingCompliance = cachingCompliance; - this.globalGeneratorNameScopeCompliance = globalGeneratorNameScopeCompliance; - this.orderByMappingCompliance = orderByMappingCompliance; - this.loadByIdCompliance = loadByIdCompliance; - this.cascadeCompliance = cascadeCompliance; - } +public record JpaComplianceImpl( + boolean orderByMappingCompliance, + boolean proxyCompliance, + boolean globalGeneratorNameScopeCompliance, + boolean queryCompliance, + boolean transactionCompliance, + boolean closedCompliance, + boolean cachingCompliance, + boolean loadByIdCompliance, + boolean cascadeCompliance) + implements JpaCompliance { @Override public boolean isJpaQueryComplianceEnabled() { diff --git a/hibernate-core/src/main/java/org/hibernate/jpa/internal/JpaEntityNotFoundDelegate.java b/hibernate-core/src/main/java/org/hibernate/jpa/internal/JpaEntityNotFoundDelegate.java index 1d80aa1666ec..9d475d4ae102 100644 --- a/hibernate-core/src/main/java/org/hibernate/jpa/internal/JpaEntityNotFoundDelegate.java +++ b/hibernate-core/src/main/java/org/hibernate/jpa/internal/JpaEntityNotFoundDelegate.java @@ -17,7 +17,7 @@ public class JpaEntityNotFoundDelegate implements EntityNotFoundDelegate, Serial public static final JpaEntityNotFoundDelegate INSTANCE = new JpaEntityNotFoundDelegate(); public void handleEntityNotFound(String entityName, Object identifier) { - final ObjectNotFoundException exception = new ObjectNotFoundException( entityName, identifier ); + final var exception = new ObjectNotFoundException( entityName, identifier ); throw new EntityNotFoundException( exception.getMessage(), exception ); } } diff --git a/hibernate-core/src/main/java/org/hibernate/jpa/internal/MutableJpaComplianceImpl.java b/hibernate-core/src/main/java/org/hibernate/jpa/internal/MutableJpaComplianceImpl.java index fc423c49ac52..dc6c9f64f7c6 100644 --- a/hibernate-core/src/main/java/org/hibernate/jpa/internal/MutableJpaComplianceImpl.java +++ b/hibernate-core/src/main/java/org/hibernate/jpa/internal/MutableJpaComplianceImpl.java @@ -6,11 +6,22 @@ import java.util.Map; -import org.hibernate.cfg.AvailableSettings; -import org.hibernate.internal.util.config.ConfigurationHelper; import org.hibernate.jpa.spi.JpaCompliance; import org.hibernate.jpa.spi.MutableJpaCompliance; +import static org.hibernate.cfg.JpaComplianceSettings.JPAQL_STRICT_COMPLIANCE; +import static org.hibernate.cfg.JpaComplianceSettings.JPA_CACHING_COMPLIANCE; +import static org.hibernate.cfg.JpaComplianceSettings.JPA_CLOSED_COMPLIANCE; +import static org.hibernate.cfg.JpaComplianceSettings.JPA_COMPLIANCE; +import static org.hibernate.cfg.JpaComplianceSettings.JPA_ID_GENERATOR_GLOBAL_SCOPE_COMPLIANCE; +import static org.hibernate.cfg.JpaComplianceSettings.JPA_LOAD_BY_ID_COMPLIANCE; +import static org.hibernate.cfg.JpaComplianceSettings.JPA_ORDER_BY_MAPPING_COMPLIANCE; +import static org.hibernate.cfg.JpaComplianceSettings.JPA_PROXY_COMPLIANCE; +import static org.hibernate.cfg.JpaComplianceSettings.JPA_QUERY_COMPLIANCE; +import static org.hibernate.cfg.JpaComplianceSettings.JPA_TRANSACTION_COMPLIANCE; +import static org.hibernate.internal.util.config.ConfigurationHelper.getBoolean; +import static org.hibernate.internal.util.config.ConfigurationHelper.toBoolean; + /** * @author Steve Ebersole */ @@ -25,53 +36,51 @@ public class MutableJpaComplianceImpl implements MutableJpaCompliance { private boolean loadByIdCompliance; public MutableJpaComplianceImpl(Map configurationSettings) { - this( - configurationSettings, - ConfigurationHelper.getBoolean( AvailableSettings.JPA_COMPLIANCE, configurationSettings ) - ); + this( configurationSettings, + getBoolean( JPA_COMPLIANCE, configurationSettings ) ); } @SuppressWarnings("ConstantConditions") public MutableJpaComplianceImpl(Map configurationSettings, boolean jpaByDefault) { - final Object legacyQueryCompliance = configurationSettings.get( AvailableSettings.JPAQL_STRICT_COMPLIANCE ); + final Object legacyQueryCompliance = configurationSettings.get( JPAQL_STRICT_COMPLIANCE ); - proxyCompliance = ConfigurationHelper.getBoolean( - AvailableSettings.JPA_PROXY_COMPLIANCE, + proxyCompliance = getBoolean( + JPA_PROXY_COMPLIANCE, configurationSettings, jpaByDefault ); - generatorNameScopeCompliance = ConfigurationHelper.getBoolean( - AvailableSettings.JPA_ID_GENERATOR_GLOBAL_SCOPE_COMPLIANCE, + generatorNameScopeCompliance = getBoolean( + JPA_ID_GENERATOR_GLOBAL_SCOPE_COMPLIANCE, configurationSettings, jpaByDefault ); - orderByMappingCompliance = ConfigurationHelper.getBoolean( - AvailableSettings.JPA_ORDER_BY_MAPPING_COMPLIANCE, + orderByMappingCompliance = getBoolean( + JPA_ORDER_BY_MAPPING_COMPLIANCE, configurationSettings, jpaByDefault ); - queryCompliance = ConfigurationHelper.getBoolean( - AvailableSettings.JPA_QUERY_COMPLIANCE, + queryCompliance = getBoolean( + JPA_QUERY_COMPLIANCE, configurationSettings, - ConfigurationHelper.toBoolean( legacyQueryCompliance, jpaByDefault ) + toBoolean( legacyQueryCompliance, jpaByDefault ) ); - transactionCompliance = ConfigurationHelper.getBoolean( - AvailableSettings.JPA_TRANSACTION_COMPLIANCE, + transactionCompliance = getBoolean( + JPA_TRANSACTION_COMPLIANCE, configurationSettings, jpaByDefault ); - closedCompliance = ConfigurationHelper.getBoolean( - AvailableSettings.JPA_CLOSED_COMPLIANCE, + closedCompliance = getBoolean( + JPA_CLOSED_COMPLIANCE, configurationSettings, jpaByDefault ); - cachingCompliance = ConfigurationHelper.getBoolean( - AvailableSettings.JPA_CACHING_COMPLIANCE, + cachingCompliance = getBoolean( + JPA_CACHING_COMPLIANCE, configurationSettings, jpaByDefault ); - loadByIdCompliance = ConfigurationHelper.getBoolean( - AvailableSettings.JPA_LOAD_BY_ID_COMPLIANCE, + loadByIdCompliance = getBoolean( + JPA_LOAD_BY_ID_COMPLIANCE, configurationSettings, jpaByDefault ); diff --git a/hibernate-core/src/main/java/org/hibernate/jpa/internal/PersistenceUnitUtilImpl.java b/hibernate-core/src/main/java/org/hibernate/jpa/internal/PersistenceUnitUtilImpl.java index bf2c0e62039a..cf3bbb5885b1 100644 --- a/hibernate-core/src/main/java/org/hibernate/jpa/internal/PersistenceUnitUtilImpl.java +++ b/hibernate-core/src/main/java/org/hibernate/jpa/internal/PersistenceUnitUtilImpl.java @@ -10,11 +10,9 @@ import org.hibernate.Hibernate; import org.hibernate.MappingException; -import org.hibernate.engine.spi.EntityEntry; import org.hibernate.engine.spi.SessionFactoryImplementor; import org.hibernate.jpa.internal.util.PersistenceUtilHelper; import org.hibernate.persister.entity.EntityPersister; -import org.hibernate.proxy.LazyInitializer; import static jakarta.persistence.spi.LoadState.NOT_LOADED; import static org.hibernate.engine.internal.ManagedTypeHelper.asManagedEntity; @@ -86,12 +84,12 @@ public Object getIdentifier(Object entity) { throw new IllegalArgumentException( "Entity may not be null" ); } - final LazyInitializer lazyInitializer = extractLazyInitializer( entity ); + final var lazyInitializer = extractLazyInitializer( entity ); if ( lazyInitializer != null ) { return lazyInitializer.getInternalIdentifier(); } else if ( isManagedEntity( entity ) ) { - final EntityEntry entityEntry = asManagedEntity( entity ).$$_hibernate_getEntityEntry(); + final var entityEntry = asManagedEntity( entity ).$$_hibernate_getEntityEntry(); if ( entityEntry != null ) { return entityEntry.getId(); } @@ -110,12 +108,12 @@ public Object getVersion(Object entity) { throw new IllegalArgumentException( "Entity may not be null" ); } - final LazyInitializer lazyInitializer = extractLazyInitializer( entity ); + final var lazyInitializer = extractLazyInitializer( entity ); if ( lazyInitializer != null ) { return getVersionFromPersister( lazyInitializer.getImplementation() ); } else if ( isManagedEntity( entity ) ) { - final EntityEntry entityEntry = asManagedEntity( entity ).$$_hibernate_getEntityEntry(); + final var entityEntry = asManagedEntity( entity ).$$_hibernate_getEntityEntry(); if ( entityEntry != null ) { return entityEntry.getVersion(); } @@ -129,37 +127,27 @@ else if ( isManagedEntity( entity ) ) { } private Object getIdentifierFromPersister(Object entity) { - final Class entityClass = Hibernate.getClass( entity ); - final EntityPersister persister; - try { - persister = - sessionFactory.getMappingMetamodel() - .getEntityDescriptor( entityClass ); - if ( persister == null ) { - throw new IllegalArgumentException( entityClass.getName() + " is not an entity" ); - } - } - catch (MappingException ex) { - throw new IllegalArgumentException( entityClass.getName() + " is not an entity", ex ); - } - return persister.getIdentifier( entity ); + return getPersister( entity ).getIdentifier( entity ); } private Object getVersionFromPersister(Object entity) { - final Class entityClass = Hibernate.getClass( entity ); - final EntityPersister persister; + return getPersister( entity ).getVersion( entity ); + } + + private EntityPersister getPersister(Object entity) { + final var entityClass = Hibernate.getClass( entity ); try { - persister = + final var entityPersister = sessionFactory.getMappingMetamodel() .getEntityDescriptor( entityClass ); - if ( persister == null ) { + if ( entityPersister == null ) { throw new IllegalArgumentException( entityClass.getName() + " is not an entity" ); } + return entityPersister; } catch (MappingException ex) { throw new IllegalArgumentException( entityClass.getName() + " is not an entity", ex ); } - return persister.getVersion( entity ); } } diff --git a/hibernate-core/src/main/java/org/hibernate/query/internal/QueryEngineImpl.java b/hibernate-core/src/main/java/org/hibernate/query/internal/QueryEngineImpl.java index dff775c74ae2..f05eb8ad9ca6 100644 --- a/hibernate-core/src/main/java/org/hibernate/query/internal/QueryEngineImpl.java +++ b/hibernate-core/src/main/java/org/hibernate/query/internal/QueryEngineImpl.java @@ -72,20 +72,20 @@ public QueryEngineImpl( ServiceRegistryImplementor serviceRegistry, Map properties, String name) { - this.dialect = serviceRegistry.requireService( JdbcServices.class ).getDialect(); - this.bindingContext = context; - this.typeConfiguration = metadata.getTypeConfiguration(); - this.sqmFunctionRegistry = createFunctionRegistry( serviceRegistry, metadata, options, dialect ); - this.sqmTranslatorFactory = resolveSqmTranslatorFactory( options, dialect ); - this.namedObjectRepository = metadata.buildNamedQueryRepository(); - this.interpretationCache = buildInterpretationCache( serviceRegistry, properties ); - this.nativeQueryInterpreter = serviceRegistry.getService( NativeQueryInterpreter.class ); - this.classLoaderService = serviceRegistry.getService( ClassLoaderService.class ); + dialect = serviceRegistry.requireService( JdbcServices.class ).getDialect(); + bindingContext = context; + typeConfiguration = metadata.getTypeConfiguration(); + sqmFunctionRegistry = createFunctionRegistry( serviceRegistry, metadata, options, dialect ); + sqmTranslatorFactory = resolveSqmTranslatorFactory( options, dialect ); + namedObjectRepository = metadata.buildNamedQueryRepository(); + interpretationCache = buildInterpretationCache( serviceRegistry, properties ); + nativeQueryInterpreter = serviceRegistry.getService( NativeQueryInterpreter.class ); + classLoaderService = serviceRegistry.getService( ClassLoaderService.class ); // here we have something nasty: we need to pass a reference to the current object to // create the NodeBuilder, but then we need the NodeBuilder to create the HqlTranslator // and that's only because we're using the NodeBuilder as the SqmCreationContext - this.nodeBuilder = createCriteriaBuilder( context, this, options, options.getUuid(), name ); - this.hqlTranslator = resolveHqlTranslator( options, dialect, nodeBuilder ); + nodeBuilder = createCriteriaBuilder( context, this, options, options.getUuid(), name ); + hqlTranslator = resolveHqlTranslator( options, dialect, nodeBuilder ); } private static SqmCriteriaNodeBuilder createCriteriaBuilder( @@ -139,12 +139,11 @@ private static SqmFunctionRegistry createFunctionRegistry( } //TODO: probably better to turn this back into an anonymous class - final FunctionContributions functionContributions = + final var functionContributions = new FunctionContributionsImpl( serviceRegistry, metadata.getTypeConfiguration(), sqmFunctionRegistry ); for ( var contributor : sortedFunctionContributors( serviceRegistry ) ) { contributor.contributeFunctions( functionContributions ); } - dialect.initializeFunctionRegistry( functionContributions ); if ( LOG_HQL_FUNCTIONS.isDebugEnabled() ) { diff --git a/hibernate-core/src/main/java/org/hibernate/resource/transaction/backend/jdbc/internal/JdbcResourceLocalTransactionCoordinatorImpl.java b/hibernate-core/src/main/java/org/hibernate/resource/transaction/backend/jdbc/internal/JdbcResourceLocalTransactionCoordinatorImpl.java index 290a5cb48594..30d52f731c52 100644 --- a/hibernate-core/src/main/java/org/hibernate/resource/transaction/backend/jdbc/internal/JdbcResourceLocalTransactionCoordinatorImpl.java +++ b/hibernate-core/src/main/java/org/hibernate/resource/transaction/backend/jdbc/internal/JdbcResourceLocalTransactionCoordinatorImpl.java @@ -166,8 +166,8 @@ private void beforeCompletionCallback() { try { transactionCoordinatorOwner.beforeTransactionCompletion(); synchronizationRegistry.notifySynchronizationsBeforeTransactionCompletion(); - for ( TransactionObserver observer : observers() ) { - observer.beforeCompletion(); + for ( var transactionObserver : observers() ) { + transactionObserver.beforeCompletion(); } } catch (RuntimeException e) { @@ -184,8 +184,8 @@ private void afterCompletionCallback(boolean successful) { final int statusToSend = successful ? Status.STATUS_COMMITTED : Status.STATUS_ROLLEDBACK; synchronizationRegistry.notifySynchronizationsAfterTransactionCompletion( statusToSend ); transactionCoordinatorOwner.afterTransactionCompletion( successful, false ); - for ( TransactionObserver observer : observers() ) { - observer.afterCompletion( successful, false ); + for ( var transactionObserver : observers() ) { + transactionObserver.afterCompletion( successful, false ); } } diff --git a/hibernate-core/src/main/java/org/hibernate/resource/transaction/backend/jta/internal/DdlTransactionIsolatorJtaImpl.java b/hibernate-core/src/main/java/org/hibernate/resource/transaction/backend/jta/internal/DdlTransactionIsolatorJtaImpl.java index bbf5987e64f0..af10bc684772 100644 --- a/hibernate-core/src/main/java/org/hibernate/resource/transaction/backend/jta/internal/DdlTransactionIsolatorJtaImpl.java +++ b/hibernate-core/src/main/java/org/hibernate/resource/transaction/backend/jta/internal/DdlTransactionIsolatorJtaImpl.java @@ -34,7 +34,7 @@ public DdlTransactionIsolatorJtaImpl(JdbcContext jdbcContext) { this.jdbcContext = jdbcContext; try { - final JtaPlatform jtaPlatform = jdbcContext.getServiceRegistry().requireService( JtaPlatform.class ); + final var jtaPlatform = jdbcContext.getServiceRegistry().requireService( JtaPlatform.class ); LOG.tracef( "DdlTransactionIsolatorJtaImpl#prepare: JtaPlatform -> %s", jtaPlatform ); final TransactionManager tm = jtaPlatform.retrieveTransactionManager(); diff --git a/hibernate-core/src/main/java/org/hibernate/resource/transaction/backend/jta/internal/JtaIsolationDelegate.java b/hibernate-core/src/main/java/org/hibernate/resource/transaction/backend/jta/internal/JtaIsolationDelegate.java index 2431ec427b72..b55cf814a042 100644 --- a/hibernate-core/src/main/java/org/hibernate/resource/transaction/backend/jta/internal/JtaIsolationDelegate.java +++ b/hibernate-core/src/main/java/org/hibernate/resource/transaction/backend/jta/internal/JtaIsolationDelegate.java @@ -58,12 +58,11 @@ public JtaIsolationDelegate( this.sqlExceptionConverter = sqlExceptionConverter::convert; } else { - SQLStateConversionDelegate delegate = new SQLStateConversionDelegate( - () -> { + var delegate = + new SQLStateConversionDelegate( () -> { throw new AssertionFailure( "Unexpected call to ConversionContext.getViolatedConstraintNameExtractor" ); - } - ); + } ); this.sqlExceptionConverter = (sqlException, message) -> delegate.convert( sqlException, message, null ); } } @@ -144,7 +143,7 @@ private void resume(Transaction surroundingTransaction) throws InvalidTransactio } private Transaction suspend() throws SystemException { - final Transaction surroundingTransaction = transactionManager.suspend(); + final var surroundingTransaction = transactionManager.suspend(); if ( surroundingTransaction != null ) { JTA_LOGGER.transactionSuspended( surroundingTransaction ); } @@ -226,7 +225,7 @@ private void releaseConnection(Connection connection) { } private HibernateException convert(SQLException sqle, String message) { - final JDBCException jdbcException = sqlExceptionConverter.apply( sqle, message ); + final var jdbcException = sqlExceptionConverter.apply( sqle, message ); return jdbcException == null ? new HibernateException( message, sqle ) : jdbcException; } diff --git a/hibernate-core/src/main/java/org/hibernate/resource/transaction/backend/jta/internal/JtaTransactionCoordinatorImpl.java b/hibernate-core/src/main/java/org/hibernate/resource/transaction/backend/jta/internal/JtaTransactionCoordinatorImpl.java index 26f7469b611a..c48c84e0697a 100644 --- a/hibernate-core/src/main/java/org/hibernate/resource/transaction/backend/jta/internal/JtaTransactionCoordinatorImpl.java +++ b/hibernate-core/src/main/java/org/hibernate/resource/transaction/backend/jta/internal/JtaTransactionCoordinatorImpl.java @@ -7,13 +7,10 @@ import java.util.ArrayList; import java.util.List; import jakarta.transaction.Status; -import jakarta.transaction.TransactionManager; -import jakarta.transaction.UserTransaction; import org.hibernate.engine.transaction.jta.platform.spi.JtaPlatform; import org.hibernate.resource.transaction.spi.IsolationDelegate; import org.hibernate.jpa.spi.JpaCompliance; -import org.hibernate.resource.jdbc.spi.JdbcSessionContext; import org.hibernate.resource.transaction.TransactionRequiredForJoinException; import org.hibernate.resource.transaction.backend.jta.internal.synchronization.RegisteredSynchronization; import org.hibernate.resource.transaction.backend.jta.internal.synchronization.SynchronizationCallbackCoordinator; @@ -75,7 +72,7 @@ public class JtaTransactionCoordinatorImpl implements TransactionCoordinator, Sy this.transactionCoordinatorOwner = owner; this.autoJoinTransactions = autoJoinTransactions; - final JdbcSessionContext jdbcSessionContext = owner.getJdbcSessionOwner().getJdbcSessionContext(); + final var jdbcSessionContext = owner.getJdbcSessionOwner().getJdbcSessionContext(); this.jtaPlatform = jtaPlatform; @@ -210,7 +207,7 @@ public TransactionDriver getTransactionDriverControl() { } private TransactionDriverControlImpl makePhysicalTransactionDelegate() { - final JtaTransactionAdapter adapter = + final var adapter = preferUserTransactions ? getTransactionAdapterPreferringUserTransaction() : getTransactionAdapterPreferringTransactionManager(); @@ -225,7 +222,7 @@ private TransactionDriverControlImpl makePhysicalTransactionDelegate() { } private JtaTransactionAdapter getTransactionAdapterPreferringTransactionManager() { - final JtaTransactionAdapter adapter = makeTransactionManagerAdapter(); + final var adapter = makeTransactionManagerAdapter(); if ( adapter == null ) { JTA_LOGGER.debug( "Unable to access TransactionManager, attempting to use UserTransaction instead" ); return makeUserTransactionAdapter(); @@ -234,7 +231,7 @@ private JtaTransactionAdapter getTransactionAdapterPreferringTransactionManager( } private JtaTransactionAdapter getTransactionAdapterPreferringUserTransaction() { - final JtaTransactionAdapter adapter = makeUserTransactionAdapter(); + final var adapter = makeUserTransactionAdapter(); if ( adapter == null ) { JTA_LOGGER.debug( "Unable to access UserTransaction, attempting to use TransactionManager instead" ); return makeTransactionManagerAdapter(); @@ -244,7 +241,7 @@ private JtaTransactionAdapter getTransactionAdapterPreferringUserTransaction() { private JtaTransactionAdapter makeUserTransactionAdapter() { try { - final UserTransaction userTransaction = jtaPlatform.retrieveUserTransaction(); + final var userTransaction = jtaPlatform.retrieveUserTransaction(); if ( userTransaction == null ) { JTA_LOGGER.debug( "JtaPlatform.retrieveUserTransaction() returned null" ); return null; @@ -261,7 +258,7 @@ private JtaTransactionAdapter makeUserTransactionAdapter() { private JtaTransactionAdapter makeTransactionManagerAdapter() { try { - final TransactionManager transactionManager = jtaPlatform.retrieveTransactionManager(); + final var transactionManager = jtaPlatform.retrieveTransactionManager(); if ( transactionManager == null ) { JTA_LOGGER.debug( "JtaPlatform.retrieveTransactionManager() returned null" ); return null; @@ -333,8 +330,8 @@ public void beforeCompletion() { } finally { synchronizationRegistry.notifySynchronizationsBeforeTransactionCompletion(); - for ( TransactionObserver observer : observers() ) { - observer.beforeCompletion(); + for ( var transactionObserver : observers() ) { + transactionObserver.beforeCompletion(); } } } @@ -351,8 +348,8 @@ public void afterCompletion(boolean successful, boolean delayed) { transactionCoordinatorOwner.afterTransactionCompletion( successful, delayed ); - for ( TransactionObserver observer : observers() ) { - observer.afterCompletion( successful, delayed ); + for ( var transactionObserver : observers() ) { + transactionObserver.afterCompletion( successful, delayed ); } synchronizationRegistered = false; diff --git a/hibernate-core/src/main/java/org/hibernate/resource/transaction/backend/jta/internal/synchronization/SynchronizationCallbackCoordinatorNonTrackingImpl.java b/hibernate-core/src/main/java/org/hibernate/resource/transaction/backend/jta/internal/synchronization/SynchronizationCallbackCoordinatorNonTrackingImpl.java index 6b3f1c93f867..41d1d8f2837c 100644 --- a/hibernate-core/src/main/java/org/hibernate/resource/transaction/backend/jta/internal/synchronization/SynchronizationCallbackCoordinatorNonTrackingImpl.java +++ b/hibernate-core/src/main/java/org/hibernate/resource/transaction/backend/jta/internal/synchronization/SynchronizationCallbackCoordinatorNonTrackingImpl.java @@ -4,8 +4,7 @@ */ package org.hibernate.resource.transaction.backend.jta.internal.synchronization; -import org.hibernate.engine.transaction.internal.jta.JtaStatusHelper; - +import static org.hibernate.engine.transaction.internal.jta.JtaStatusHelper.isCommitted; import static org.hibernate.resource.transaction.backend.jta.internal.JtaLogging.JTA_LOGGER; /** @@ -43,7 +42,7 @@ public void beforeCompletion() { @Override public void afterCompletion(int status) { JTA_LOGGER.tracef( "Synchronization coordinator: afterCompletion(status=%s)", status ); - doAfterCompletion( JtaStatusHelper.isCommitted( status ), false ); + doAfterCompletion( isCommitted( status ), false ); } protected void doAfterCompletion(boolean successful, boolean delayed) { diff --git a/hibernate-core/src/main/java/org/hibernate/resource/transaction/backend/jta/internal/synchronization/SynchronizationCallbackCoordinatorTrackingImpl.java b/hibernate-core/src/main/java/org/hibernate/resource/transaction/backend/jta/internal/synchronization/SynchronizationCallbackCoordinatorTrackingImpl.java index 0e9019ce7c32..10ef463d487c 100644 --- a/hibernate-core/src/main/java/org/hibernate/resource/transaction/backend/jta/internal/synchronization/SynchronizationCallbackCoordinatorTrackingImpl.java +++ b/hibernate-core/src/main/java/org/hibernate/resource/transaction/backend/jta/internal/synchronization/SynchronizationCallbackCoordinatorTrackingImpl.java @@ -5,8 +5,9 @@ package org.hibernate.resource.transaction.backend.jta.internal.synchronization; import org.hibernate.HibernateException; -import org.hibernate.engine.transaction.internal.jta.JtaStatusHelper; +import static org.hibernate.engine.transaction.internal.jta.JtaStatusHelper.isCommitted; +import static org.hibernate.engine.transaction.internal.jta.JtaStatusHelper.isRollback; import static org.hibernate.resource.transaction.backend.jta.internal.JtaLogging.JTA_LOGGER; /** @@ -50,7 +51,7 @@ public void afterCompletion(int status) { // As far as we know, this can only ever happen in the rollback case where the transaction had been rolled // back on a separate "reaper" thread. Since we know the transaction status and that check is not as heavy // as accessing the current thread, we check that first - if ( JtaStatusHelper.isRollback( status ) ) { + if ( isRollback( status ) ) { // We are processing a rollback, see if it is the same thread final long currentThreadId = Thread.currentThread().getId(); final boolean isRegistrationThread = currentThreadId == registrationThreadId; @@ -64,7 +65,7 @@ public void afterCompletion(int status) { } // otherwise, do the callback immediately - doAfterCompletion( JtaStatusHelper.isCommitted( status ), false ); + doAfterCompletion( isCommitted( status ), false ); } @Override diff --git a/hibernate-core/src/main/java/org/hibernate/resource/transaction/internal/SynchronizationRegistryStandardImpl.java b/hibernate-core/src/main/java/org/hibernate/resource/transaction/internal/SynchronizationRegistryStandardImpl.java index 617380f3310f..1c38252c0e5c 100644 --- a/hibernate-core/src/main/java/org/hibernate/resource/transaction/internal/SynchronizationRegistryStandardImpl.java +++ b/hibernate-core/src/main/java/org/hibernate/resource/transaction/internal/SynchronizationRegistryStandardImpl.java @@ -52,7 +52,7 @@ public void registerSynchronization(Synchronization synchronization) { public void notifySynchronizationsBeforeTransactionCompletion() { LOG.trace( "Notifying Synchronizations (before completion)" ); if ( synchronizations != null ) { - for ( Synchronization synchronization : synchronizations ) { + for ( var synchronization : synchronizations ) { try { synchronization.beforeCompletion(); } @@ -72,7 +72,7 @@ public void notifySynchronizationsAfterTransactionCompletion(int status) { LOG.tracef( "Notifying Synchronizations (after completion with status %s)", status ); if ( synchronizations != null ) { try { - for ( Synchronization synchronization : synchronizations ) { + for ( var synchronization : synchronizations ) { try { synchronization.afterCompletion( status ); } diff --git a/hibernate-core/src/main/java/org/hibernate/resource/transaction/internal/TransactionCoordinatorBuilderInitiator.java b/hibernate-core/src/main/java/org/hibernate/resource/transaction/internal/TransactionCoordinatorBuilderInitiator.java index ce78d38684ab..af8b5b53b9ce 100644 --- a/hibernate-core/src/main/java/org/hibernate/resource/transaction/internal/TransactionCoordinatorBuilderInitiator.java +++ b/hibernate-core/src/main/java/org/hibernate/resource/transaction/internal/TransactionCoordinatorBuilderInitiator.java @@ -8,12 +8,13 @@ import org.hibernate.boot.registry.StandardServiceInitiator; import org.hibernate.boot.registry.selector.spi.StrategySelector; -import org.hibernate.cfg.AvailableSettings; import org.hibernate.internal.log.DeprecationLogger; import org.hibernate.resource.transaction.backend.jdbc.internal.JdbcResourceLocalTransactionCoordinatorBuilderImpl; import org.hibernate.resource.transaction.spi.TransactionCoordinatorBuilder; import org.hibernate.service.spi.ServiceRegistryImplementor; +import static org.hibernate.cfg.TransactionSettings.TRANSACTION_COORDINATOR_STRATEGY; + /** * StandardServiceInitiator for initiating the TransactionCoordinatorBuilder service. * @@ -30,15 +31,14 @@ public class TransactionCoordinatorBuilderInitiator implements StandardServiceIn @Override public TransactionCoordinatorBuilder initiateService(Map configurationValues, ServiceRegistryImplementor registry) { - return registry.requireService( StrategySelector.class ).resolveDefaultableStrategy( - TransactionCoordinatorBuilder.class, - determineStrategySelection( configurationValues ), - JdbcResourceLocalTransactionCoordinatorBuilderImpl.INSTANCE - ); + return registry.requireService( StrategySelector.class ) + .resolveDefaultableStrategy( TransactionCoordinatorBuilder.class, + determineStrategySelection( configurationValues ), + JdbcResourceLocalTransactionCoordinatorBuilderImpl.INSTANCE ); } - private static Object determineStrategySelection(Map configurationValues) { - final Object coordinatorStrategy = configurationValues.get( AvailableSettings.TRANSACTION_COORDINATOR_STRATEGY ); + private static Object determineStrategySelection(Map configurationValues) { + final Object coordinatorStrategy = configurationValues.get( TRANSACTION_COORDINATOR_STRATEGY ); if ( coordinatorStrategy != null ) { return coordinatorStrategy; } @@ -47,7 +47,7 @@ private static Object determineStrategySelection(Map configurationValues) { if ( legacySetting != null ) { DeprecationLogger.DEPRECATION_LOGGER.logDeprecatedTransactionFactorySetting( LEGACY_SETTING_NAME, - AvailableSettings.TRANSACTION_COORDINATOR_STRATEGY + TRANSACTION_COORDINATOR_STRATEGY ); return legacySetting; } diff --git a/hibernate-core/src/main/java/org/hibernate/service/internal/AbstractServiceRegistryImpl.java b/hibernate-core/src/main/java/org/hibernate/service/internal/AbstractServiceRegistryImpl.java index 66603d74ee2a..0d657f0f41a2 100644 --- a/hibernate-core/src/main/java/org/hibernate/service/internal/AbstractServiceRegistryImpl.java +++ b/hibernate-core/src/main/java/org/hibernate/service/internal/AbstractServiceRegistryImpl.java @@ -7,7 +7,6 @@ import java.lang.reflect.Method; import java.util.HashSet; import java.util.List; -import java.util.ListIterator; import java.util.Set; import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.ConcurrentMap; @@ -21,7 +20,6 @@ import org.hibernate.internal.CoreLogging; import org.hibernate.internal.CoreMessageLogger; import org.hibernate.internal.util.collections.CollectionHelper; -import org.hibernate.internal.util.config.ConfigurationHelper; import org.hibernate.service.Service; import org.hibernate.service.ServiceRegistry; import org.hibernate.service.UnknownServiceException; @@ -36,6 +34,8 @@ import org.checkerframework.checker.nullness.qual.Nullable; +import static org.hibernate.internal.util.config.ConfigurationHelper.getBoolean; + /** * Basic implementation of the {@link ServiceRegistry} and {@link ServiceRegistryImplementor} contracts. * @@ -58,9 +58,10 @@ public abstract class AbstractServiceRegistryImpl // (i.e., configured, dependencies injected, and started) private final ConcurrentMap,Service> initializedServiceByRole = new ConcurrentHashMap<>(); - // IMPL NOTE : the list used for ordered destruction. Cannot used map above because we need to - // iterate it in reverse order which is only available through ListIterator - // assume 20 services for initial sizing + // IMPL NOTE: the list used for ordered destruction. Cannot use the map above, + // because we need to iterate it in reverse order, which is only available + // through ListIterator. + // Assume 20 services for initial sizing. // All access guarded by synchronization on the serviceBindingList itself. private final List> serviceBindingList = CollectionHelper.arrayList( 20 ); @@ -80,7 +81,7 @@ protected AbstractServiceRegistryImpl( boolean autoCloseRegistry) { this.parent = parent; - this.allowCrawling = ConfigurationHelper.getBoolean( ALLOW_CRAWLING, Environment.getProperties(), true ); + this.allowCrawling = getBoolean( ALLOW_CRAWLING, Environment.getProperties(), true ); this.autoCloseRegistry = autoCloseRegistry; } @@ -91,29 +92,28 @@ public AbstractServiceRegistryImpl(BootstrapServiceRegistry bootstrapServiceRegi public AbstractServiceRegistryImpl( BootstrapServiceRegistry bootstrapServiceRegistry, boolean autoCloseRegistry) { - + this.autoCloseRegistry = autoCloseRegistry; if ( !(bootstrapServiceRegistry instanceof ServiceRegistryImplementor) ) { throw new IllegalArgumentException( "ServiceRegistry parent needs to implement ServiceRegistryImplementor" ); } this.parent = (ServiceRegistryImplementor) bootstrapServiceRegistry; - this.allowCrawling = ConfigurationHelper.getBoolean( ALLOW_CRAWLING, Environment.getProperties(), true ); - this.autoCloseRegistry = autoCloseRegistry; + this.allowCrawling = getBoolean( ALLOW_CRAWLING, Environment.getProperties(), true ); } // For nullness checking purposes protected void initialize() { - if ( this.parent != null ) { - this.parent.registerChild( this ); + if ( parent != null ) { + parent.registerChild( this ); } } protected void createServiceBinding(ServiceInitiator initiator) { - final ServiceBinding serviceBinding = new ServiceBinding<>( this, initiator ); - serviceBindingMap.put( initiator.getServiceInitiated(), serviceBinding ); + serviceBindingMap.put( initiator.getServiceInitiated(), + new ServiceBinding<>( this, initiator ) ); } protected void createServiceBinding(ProvidedService providedService) { - ServiceBinding binding = locateServiceBinding( providedService.getServiceRole(), false ); + var binding = locateServiceBinding( providedService.getServiceRole(), false ); if ( binding == null ) { binding = new ServiceBinding<>( this, providedService.getServiceRole(), providedService.getService() ); serviceBindingMap.put( providedService.getServiceRole(), binding ); @@ -137,7 +137,7 @@ protected void visitServiceBindings(Consumer> action) { @SuppressWarnings("unchecked") protected @Nullable ServiceBinding locateServiceBinding(Class serviceRole, boolean checkParent) { - ServiceBinding serviceBinding = (ServiceBinding) serviceBindingMap.get( serviceRole ); + var serviceBinding = (ServiceBinding) serviceBindingMap.get( serviceRole ); if ( serviceBinding == null && checkParent && parent != null ) { // look in parent serviceBinding = parent.locateServiceBinding( serviceRole ); @@ -158,7 +158,7 @@ protected void visitServiceBindings(Consumer> action) { } // perform a crawl looking for an alternate registration - for ( ServiceBinding binding : serviceBindingMap.values() ) { + for ( var binding : serviceBindingMap.values() ) { if ( serviceRole.isAssignableFrom( binding.getServiceRole() ) ) { // we found an alternate... LOG.alternateServiceRole( serviceRole.getName(), binding.getServiceRole().getName() ); @@ -252,7 +252,7 @@ protected void registerService(ServiceBinding serviceBind } protected @Nullable R createService(ServiceBinding serviceBinding) { - final ServiceInitiator serviceInitiator = serviceBinding.getServiceInitiator(); + final var serviceInitiator = serviceBinding.getServiceInitiator(); if ( serviceInitiator == null ) { // this condition should never ever occur throw new UnknownServiceException( serviceBinding.getServiceRole() ); @@ -355,10 +355,10 @@ public synchronized void destroy() { //threads not owning the synchronization lock can't get an invalid Service: initializedServiceByRole.clear(); synchronized (serviceBindingList) { - final ListIterator> serviceBindingsIterator = + final var serviceBindingsIterator = serviceBindingList.listIterator( serviceBindingList.size() ); while ( serviceBindingsIterator.hasPrevious() ) { - final ServiceBinding serviceBinding = serviceBindingsIterator.previous(); + final var serviceBinding = serviceBindingsIterator.previous(); serviceBinding.getLifecycleOwner().stopService( serviceBinding ); } serviceBindingList.clear(); @@ -375,7 +375,7 @@ public synchronized void destroy() { @Override public synchronized void stopService(ServiceBinding binding) { - final Service service = binding.getService(); + final var service = binding.getService(); if ( service instanceof Stoppable stoppable ) { try { stoppable.stop(); @@ -392,10 +392,7 @@ public synchronized void registerChild(ServiceRegistryImplementor child) { childRegistries = new HashSet<>(); } if ( !childRegistries.add( child ) ) { - LOG.warnf( - "Child ServiceRegistry [%s] was already registered; this will end badly later", - child - ); + LOG.warnf( "Child ServiceRegistry [%s] was already registered; this will end badly later", child ); } } @@ -452,7 +449,7 @@ public synchronized void resetParent(@Nullable BootstrapServiceRegistry newParen } if ( childRegistries != null ) { - for ( ServiceRegistryImplementor childRegistry : childRegistries ) { + for ( var childRegistry : childRegistries ) { final T extracted = childRegistry.getService( serviceRole ); if ( extracted != null ) { return extracted; diff --git a/hibernate-core/src/main/java/org/hibernate/service/internal/SessionFactoryServiceRegistryBuilderImpl.java b/hibernate-core/src/main/java/org/hibernate/service/internal/SessionFactoryServiceRegistryBuilderImpl.java index acc0716fcb6b..32de60d7bd10 100644 --- a/hibernate-core/src/main/java/org/hibernate/service/internal/SessionFactoryServiceRegistryBuilderImpl.java +++ b/hibernate-core/src/main/java/org/hibernate/service/internal/SessionFactoryServiceRegistryBuilderImpl.java @@ -5,7 +5,6 @@ package org.hibernate.service.internal; import java.util.ArrayList; -import java.util.Iterator; import java.util.List; import org.hibernate.boot.spi.SessionFactoryOptions; @@ -16,20 +15,22 @@ import org.hibernate.service.spi.SessionFactoryServiceRegistry; import org.hibernate.service.spi.SessionFactoryServiceRegistryBuilder; +import static org.hibernate.service.internal.StandardSessionFactoryServiceInitiators.buildStandardServiceInitiatorList; + /** * @author Steve Ebersole */ public class SessionFactoryServiceRegistryBuilderImpl implements SessionFactoryServiceRegistryBuilder { private final ServiceRegistryImplementor parent; - private final List> initiators = StandardSessionFactoryServiceInitiators.buildStandardServiceInitiatorList(); - private final List> providedServices = new ArrayList<>(); + private final List> initiators = buildStandardServiceInitiatorList(); + private final List> providedServices = new ArrayList<>(); public SessionFactoryServiceRegistryBuilderImpl(ServiceRegistryImplementor parent) { this.parent = parent; if ( parent != null ) { - for ( Iterator> iterator = initiators.iterator(); iterator.hasNext(); ) { - final SessionFactoryServiceInitiator initiator = iterator.next(); + for ( var iterator = initiators.iterator(); iterator.hasNext(); ) { + final var initiator = iterator.next(); if ( parent.locateServiceBinding( initiator.getServiceInitiated() ) != null ) { // Parent takes precedence over the standard service initiators iterator.remove(); diff --git a/hibernate-core/src/main/java/org/hibernate/service/internal/SessionFactoryServiceRegistryFactoryImpl.java b/hibernate-core/src/main/java/org/hibernate/service/internal/SessionFactoryServiceRegistryFactoryImpl.java index dc28ee40e107..6d116a4a8d43 100644 --- a/hibernate-core/src/main/java/org/hibernate/service/internal/SessionFactoryServiceRegistryFactoryImpl.java +++ b/hibernate-core/src/main/java/org/hibernate/service/internal/SessionFactoryServiceRegistryFactoryImpl.java @@ -29,16 +29,11 @@ public SessionFactoryServiceRegistryFactoryImpl(ServiceRegistryImplementor theBa public SessionFactoryServiceRegistry buildServiceRegistry( SessionFactoryImplementor sessionFactory, SessionFactoryOptions options) { - final ClassLoaderService classLoaderService = - options.getServiceRegistry().requireService( ClassLoaderService.class ); - final SessionFactoryServiceRegistryBuilderImpl builder = - new SessionFactoryServiceRegistryBuilderImpl( theBasicServiceRegistry ); - - for ( SessionFactoryServiceContributor contributor : - classLoaderService.loadJavaServices( SessionFactoryServiceContributor.class ) ) { + final var classLoaderService = options.getServiceRegistry().requireService( ClassLoaderService.class ); + final var builder = new SessionFactoryServiceRegistryBuilderImpl( theBasicServiceRegistry ); + for ( var contributor : classLoaderService.loadJavaServices( SessionFactoryServiceContributor.class ) ) { contributor.contribute( builder ); } - return builder.buildSessionFactoryServiceRegistry( sessionFactory, options ); } } diff --git a/hibernate-core/src/main/java/org/hibernate/service/internal/SessionFactoryServiceRegistryImpl.java b/hibernate-core/src/main/java/org/hibernate/service/internal/SessionFactoryServiceRegistryImpl.java index 65a2ab6997ae..beef8f4c7952 100644 --- a/hibernate-core/src/main/java/org/hibernate/service/internal/SessionFactoryServiceRegistryImpl.java +++ b/hibernate-core/src/main/java/org/hibernate/service/internal/SessionFactoryServiceRegistryImpl.java @@ -47,31 +47,32 @@ private SessionFactoryServiceRegistryImpl( public static SessionFactoryServiceRegistryImpl create( ServiceRegistryImplementor parent, List> initiators, - List> providedServices, + List> providedServices, SessionFactoryImplementor sessionFactory, SessionFactoryOptions sessionFactoryOptions) { - final SessionFactoryServiceRegistryImpl instance = - new SessionFactoryServiceRegistryImpl( parent, sessionFactory, sessionFactoryOptions ); + final var instance = new SessionFactoryServiceRegistryImpl( parent, sessionFactory, sessionFactoryOptions ); instance.initialize( initiators, providedServices ); return instance; } - protected void initialize(List> initiators, List> providedServices) { + protected void initialize( + List> initiators, + List> providedServices) { super.initialize(); // for now, just use the standard initiator list - for ( SessionFactoryServiceInitiator initiator : initiators ) { + for ( var initiator : initiators ) { // create the bindings up front to help identify to which registry services belong createServiceBinding( initiator ); } - for ( ProvidedService providedService : providedServices ) { + for ( var providedService : providedServices ) { createServiceBinding( providedService ); } } @Override public R initiateService(ServiceInitiator serviceInitiator) { - SessionFactoryServiceInitiator sessionFactoryServiceInitiator = (SessionFactoryServiceInitiator) serviceInitiator; + final var sessionFactoryServiceInitiator = (SessionFactoryServiceInitiator) serviceInitiator; return sessionFactoryServiceInitiator.initiateService( this ); } @@ -108,7 +109,8 @@ public ServiceRegistryImplementor getServiceRegistry() { //noinspection unchecked return (R) sessionFactory.getEventEngine().getListenerRegistry(); } - - return super.getService( serviceRole ); + else { + return super.getService( serviceRole ); + } } } diff --git a/hibernate-core/src/main/java/org/hibernate/service/internal/StandardSessionFactoryServiceInitiators.java b/hibernate-core/src/main/java/org/hibernate/service/internal/StandardSessionFactoryServiceInitiators.java index 09e5811a8218..f50a2eb196e7 100644 --- a/hibernate-core/src/main/java/org/hibernate/service/internal/StandardSessionFactoryServiceInitiators.java +++ b/hibernate-core/src/main/java/org/hibernate/service/internal/StandardSessionFactoryServiceInitiators.java @@ -22,11 +22,9 @@ public final class StandardSessionFactoryServiceInitiators { public static List> buildStandardServiceInitiatorList() { final ArrayList> serviceInitiators = new ArrayList<>(); - serviceInitiators.add( StatisticsInitiator.INSTANCE ); serviceInitiators.add( CacheInitiator.INSTANCE ); serviceInitiators.add( NativeQueryInterpreterInitiator.INSTANCE ); - return serviceInitiators; } diff --git a/hibernate-core/src/main/java/org/hibernate/sql/results/jdbc/internal/JdbcValuesMappingProducerProviderStandard.java b/hibernate-core/src/main/java/org/hibernate/sql/results/jdbc/internal/JdbcValuesMappingProducerProviderStandard.java index 1f699f4080ca..8b33f7ff81cb 100644 --- a/hibernate-core/src/main/java/org/hibernate/sql/results/jdbc/internal/JdbcValuesMappingProducerProviderStandard.java +++ b/hibernate-core/src/main/java/org/hibernate/sql/results/jdbc/internal/JdbcValuesMappingProducerProviderStandard.java @@ -9,7 +9,6 @@ import org.hibernate.query.results.internal.ResultSetMappingImpl; import org.hibernate.sql.ast.spi.SqlSelection; import org.hibernate.sql.ast.tree.select.QueryGroup; -import org.hibernate.sql.ast.tree.select.QueryPart; import org.hibernate.sql.ast.tree.select.SelectStatement; import org.hibernate.sql.results.jdbc.spi.JdbcValuesMappingProducer; import org.hibernate.sql.results.jdbc.spi.JdbcValuesMappingProducerProvider; @@ -37,10 +36,12 @@ public JdbcValuesMappingProducer buildMappingProducer( private static List getSelections(SelectStatement selectStatement) { if ( selectStatement.getQueryPart() instanceof QueryGroup queryGroup ) { - for ( QueryPart queryPart : queryGroup.getQueryParts() ) { - if ( !(queryPart.getFirstQuerySpec().getSelectClause().getSqlSelections() - .get( 0 ).getExpressionType().getSingleJdbcMapping().getJdbcType() instanceof NullJdbcType) ) { - return queryPart.getFirstQuerySpec().getSelectClause().getSqlSelections(); + for ( var queryPart : queryGroup.getQueryParts() ) { + final var selectClause = queryPart.getFirstQuerySpec().getSelectClause(); + if ( !( selectClause.getSqlSelections().get( 0 ) + .getExpressionType().getSingleJdbcMapping().getJdbcType() + instanceof NullJdbcType ) ) { + return selectClause.getSqlSelections(); } } }