55package org .hibernate .metamodel .internal ;
66
77import jakarta .persistence .metamodel .Attribute ;
8- import jakarta .persistence .metamodel .IdentifiableType ;
98import jakarta .persistence .metamodel .SingularAttribute ;
109import jakarta .persistence .metamodel .Type ;
1110import org .hibernate .AssertionFailure ;
1716import org .hibernate .internal .CoreLogging ;
1817import org .hibernate .internal .CoreMessageLogger ;
1918import org .hibernate .internal .util .collections .ArrayHelper ;
20- import org .hibernate .internal .util .collections .CollectionHelper ;
2119import org .hibernate .mapping .Component ;
2220import org .hibernate .mapping .MappedSuperclass ;
2321import org .hibernate .mapping .PersistentClass ;
5654import java .util .function .BiFunction ;
5755
5856import static java .util .Collections .unmodifiableMap ;
57+ import static org .hibernate .internal .util .collections .CollectionHelper .mapOfSize ;
5958import static org .hibernate .metamodel .internal .InjectionHelper .injectField ;
6059
6160/**
@@ -158,17 +157,11 @@ public Set<EmbeddableDomainType<?>> getEmbeddableTypeSet() {
158157
159158 public Map <Class <?>, MappedSuperclassDomainType <?>> getMappedSuperclassTypeMap () {
160159 // we need to actually build this map...
161- final Map <Class <?>, MappedSuperclassDomainType <?>> mappedSuperClassTypeMap = CollectionHelper .mapOfSize (
162- mappedSuperclassByMappedSuperclassMapping .size ()
163- );
164-
165- for ( MappedSuperclassDomainType <?> mappedSuperclassType : mappedSuperclassByMappedSuperclassMapping .values () ) {
166- mappedSuperClassTypeMap .put (
167- mappedSuperclassType .getJavaType (),
168- mappedSuperclassType
169- );
160+ final Map <Class <?>, MappedSuperclassDomainType <?>> mappedSuperClassTypeMap =
161+ mapOfSize ( mappedSuperclassByMappedSuperclassMapping .size () );
162+ for ( var mappedSuperclassType : mappedSuperclassByMappedSuperclassMapping .values () ) {
163+ mappedSuperClassTypeMap .put ( mappedSuperclassType .getJavaType (), mappedSuperclassType );
170164 }
171-
172165 return mappedSuperClassTypeMap ;
173166 }
174167
@@ -263,12 +256,12 @@ public Map<String, IdentifiableDomainType<?>> getIdentifiableTypesByName() {
263256 Property property ,
264257 IdentifiableDomainType <X > entityType ,
265258 BiFunction <IdentifiableDomainType <X >, Property , PersistentAttribute <X , ?>> factoryFunction ) {
266- final Component component = property .getValue () instanceof Component comp ? comp : null ;
267- if ( component != null && component .isGeneric () ) {
259+ if ( property .getValue () instanceof Component component && component .isGeneric () ) {
268260 // This is an embeddable property that uses generics, we have to retrieve the generic
269261 // component previously registered and create the concrete attribute
270- final Component genericComponent = runtimeModelCreationContext .getMetadata ()
271- .getGenericComponent ( component .getComponentClass () );
262+ final Component genericComponent =
263+ runtimeModelCreationContext .getMetadata ()
264+ .getGenericComponent ( component .getComponentClass () );
272265 final Property genericProperty = property .copy ();
273266 genericProperty .setValue ( genericComponent );
274267 genericProperty .setGeneric ( true );
@@ -382,8 +375,9 @@ else if ( safeMapping.isVersioned() && property == safeMapping.getVersion() ) {
382375
383376
384377 while ( ! embeddablesToProcess .isEmpty () ) {
385- final ArrayList <EmbeddableDomainType <?>> processingEmbeddables = new ArrayList <>( embeddablesToProcess .size () );
386- for ( List <EmbeddableDomainType <?>> embeddableDomainTypes : embeddablesToProcess .values () ) {
378+ final List <EmbeddableDomainType <?>> processingEmbeddables =
379+ new ArrayList <>( embeddablesToProcess .size () );
380+ for ( var embeddableDomainTypes : embeddablesToProcess .values () ) {
387381 processingEmbeddables .addAll ( embeddableDomainTypes );
388382 }
389383
@@ -403,7 +397,6 @@ else if ( safeMapping.isVersioned() && property == safeMapping.getVersion() ) {
403397 // generic component embeddables used just for concrete type resolution
404398 if ( !component .isGeneric () && !( embeddable .getExpressibleJavaType () instanceof EntityJavaType <?> ) ) {
405399 embeddables .put ( embeddable .getJavaType (), embeddable );
406-
407400 if ( staticMetamodelScanEnabled ) {
408401 populateStaticMetamodel ( embeddable , processedMetamodelClasses );
409402 }
@@ -414,27 +407,24 @@ else if ( safeMapping.isVersioned() && property == safeMapping.getVersion() ) {
414407
415408 private static boolean isIdentifierProperty (Property property , MappedSuperclass mappedSuperclass ) {
416409 final Component identifierMapper = mappedSuperclass .getIdentifierMapper ();
417- return identifierMapper != null && ArrayHelper .contains (
418- identifierMapper .getPropertyNames (),
419- property .getName ()
420- );
410+ return identifierMapper != null
411+ && ArrayHelper .contains ( identifierMapper .getPropertyNames (), property .getName () );
421412 }
422413
423414 private <T > void addAttribute (EmbeddableDomainType <T > embeddable , Property property , Component component ) {
424415 final PersistentAttribute <T , ?> attribute =
425416 attributeFactory .buildAttribute ( embeddable , property );
426417 if ( attribute != null ) {
427- final Property superclassProperty = getMappedSuperclassProperty (
428- property .getName (),
429- component .getMappedSuperclass ()
430- );
418+ final Property superclassProperty =
419+ getMappedSuperclassProperty ( property .getName (),
420+ component .getMappedSuperclass () );
431421 if ( superclassProperty != null && superclassProperty .isGeneric () ) {
432422 @ SuppressWarnings ("unchecked" )
433- final AttributeContainer < T > attributeContainer = (AttributeContainer <T >) embeddable ;
423+ final var attributeContainer = (AttributeContainer <T >) embeddable ;
434424 attributeContainer .getInFlightAccess ().addConcreteGenericAttribute ( attribute );
435425 }
436426 else {
437- addAttribute (embeddable , attribute );
427+ addAttribute ( embeddable , attribute );
438428 }
439429 }
440430 }
@@ -456,8 +446,9 @@ private <T> void addAttribute(ManagedDomainType<T> type, PersistentAttribute<T,
456446 @ SuppressWarnings ("unchecked" )
457447 final AttributeContainer <T > container = (AttributeContainer <T >) type ;
458448 final AttributeContainer .InFlightAccess <T > inFlightAccess = container .getInFlightAccess ();
459- final boolean virtual = attribute .getPersistentAttributeType () == Attribute .PersistentAttributeType .EMBEDDED
460- && attribute .getAttributeJavaType () instanceof EntityJavaType <?>;
449+ final boolean virtual =
450+ attribute .getPersistentAttributeType () == Attribute .PersistentAttributeType .EMBEDDED
451+ && attribute .getAttributeJavaType () instanceof EntityJavaType <?>;
461452 if ( virtual ) {
462453 @ SuppressWarnings ("unchecked" )
463454 final EmbeddableDomainType <T > embeddableDomainType =
@@ -487,24 +478,19 @@ private <T> void applyIdMetadata(PersistentClass persistentClass, IdentifiableDo
487478 @ SuppressWarnings ("unchecked" )
488479 final AttributeContainer <T > attributeContainer = (AttributeContainer <T >) identifiableType ;
489480 if ( declaredIdentifierProperty != null ) {
490- final SingularPersistentAttribute < T , ?> idAttribute =
481+ final var idAttribute =
491482 (SingularPersistentAttribute <T , ?>)
492- buildAttribute (
493- declaredIdentifierProperty ,
494- identifiableType ,
495- attributeFactory ::buildIdAttribute
496- );
483+ buildAttribute ( declaredIdentifierProperty , identifiableType ,
484+ attributeFactory ::buildIdAttribute );
497485 attributeContainer .getInFlightAccess ().applyIdAttribute ( idAttribute );
498486 }
499487 else {
500488 final Property superclassIdentifier = getMappedSuperclassIdentifier ( persistentClass );
501489 if ( superclassIdentifier != null && superclassIdentifier .isGeneric () ) {
502490 // If the superclass identifier is generic we have to build the attribute to register the concrete type
503- final SingularPersistentAttribute <T , ?> concreteIdentifier =
504- attributeFactory .buildIdAttribute (
505- identifiableType ,
506- persistentClass .getIdentifierProperty ()
507- );
491+ final var concreteIdentifier =
492+ attributeFactory .buildIdAttribute ( identifiableType ,
493+ persistentClass .getIdentifierProperty () );
508494 attributeContainer .getInFlightAccess ().addConcreteGenericAttribute ( concreteIdentifier );
509495 }
510496 }
@@ -542,7 +528,7 @@ private <T> void applyIdMetadata(PersistentClass persistentClass, IdentifiableDo
542528 final IdentifiableDomainType <?> idDomainType =
543529 identifiableTypesByName .get ( compositeId .getOwner ().getEntityName () );
544530 @ SuppressWarnings ("unchecked" )
545- final AbstractIdentifiableType < T > idType = (AbstractIdentifiableType <T >) idDomainType ;
531+ final var idType = (AbstractIdentifiableType <T >) idDomainType ;
546532 applyIdAttributes ( identifiableType , idType , propertySpan , cidProperties , idClassType );
547533 }
548534 }
@@ -562,7 +548,7 @@ private <T> void applyIdAttributes(
562548 }
563549
564550 @ SuppressWarnings ("unchecked" )
565- final AttributeContainer < T > container = (AttributeContainer <T >) identifiableType ;
551+ final var container = (AttributeContainer <T >) identifiableType ;
566552 container .getInFlightAccess ().applyNonAggregatedIdAttributes ( idAttributes , idClassType );
567553 }
568554
@@ -579,54 +565,45 @@ private Property getMappedSuperclassIdentifier(PersistentClass persistentClass)
579565 }
580566
581567 private <Y > EmbeddableTypeImpl <Y > applyIdClassMetadata (Component idClassComponent ) {
582- final JavaType <Y > javaType =
583- getTypeConfiguration ().getJavaTypeRegistry ()
584- .resolveManagedTypeDescriptor ( idClassComponent .getComponentClass () );
585-
586- final MappedSuperclass mappedSuperclass = idClassComponent .getMappedSuperclass ();
587- final MappedSuperclassDomainType <? super Y > superType ;
588- if ( mappedSuperclass != null ) {
589- //noinspection unchecked
590- superType = (MappedSuperclassDomainType <? super Y >) locateMappedSuperclassType ( mappedSuperclass );
591- }
592- else {
593- superType = null ;
594- }
595-
596- final EmbeddableTypeImpl <Y > embeddableType = new EmbeddableTypeImpl <>(
597- javaType ,
598- superType ,
599- null ,
600- false ,
601- getJpaMetamodel ()
602- );
568+ final EmbeddableTypeImpl <Y > embeddableType =
569+ new EmbeddableTypeImpl <>(
570+ getTypeConfiguration ().getJavaTypeRegistry ()
571+ .resolveManagedTypeDescriptor ( idClassComponent .getComponentClass () ),
572+ getMappedSuperclassDomainType ( idClassComponent ),
573+ null ,
574+ false ,
575+ getJpaMetamodel ()
576+ );
603577 registerEmbeddableType ( embeddableType , idClassComponent );
604578 return embeddableType ;
605579 }
606580
581+ @ SuppressWarnings ("unchecked" )
582+ private <Y > MappedSuperclassDomainType <? super Y > getMappedSuperclassDomainType (Component idClassComponent ) {
583+ final MappedSuperclass mappedSuperclass = idClassComponent .getMappedSuperclass ();
584+ return mappedSuperclass == null ? null
585+ : (MappedSuperclassDomainType <? super Y >)
586+ locateMappedSuperclassType ( mappedSuperclass );
587+ }
588+
607589 private <X > void applyIdMetadata (MappedSuperclass mappingType , MappedSuperclassDomainType <X > jpaMappingType ) {
608590 @ SuppressWarnings ("unchecked" )
609- final AttributeContainer < X > attributeContainer = (AttributeContainer <X >) jpaMappingType ;
591+ final var attributeContainer = (AttributeContainer <X >) jpaMappingType ;
610592 if ( mappingType .hasIdentifierProperty () ) {
611593 final Property declaredIdentifierProperty = mappingType .getDeclaredIdentifierProperty ();
612594 if ( declaredIdentifierProperty != null ) {
613- final SingularPersistentAttribute < X , ?> attribute =
595+ final var attribute =
614596 (SingularPersistentAttribute <X , ?>)
615- buildAttribute (
616- declaredIdentifierProperty ,
617- jpaMappingType ,
618- attributeFactory ::buildIdAttribute
619- );
597+ buildAttribute ( declaredIdentifierProperty , jpaMappingType ,
598+ attributeFactory ::buildIdAttribute );
620599 attributeContainer .getInFlightAccess ().applyIdAttribute ( attribute );
621600 }
622601 }
623602 //a MappedSuperclass can have no identifier if the id is set below in the hierarchy
624603 else if ( mappingType .getIdentifierMapper () != null ) {
625- final Set <SingularPersistentAttribute <? super X , ?>> attributes =
626- buildIdClassAttributes (
627- jpaMappingType ,
628- mappingType .getIdentifierMapper ().getProperties ()
629- );
604+ final var attributes =
605+ buildIdClassAttributes ( jpaMappingType ,
606+ mappingType .getIdentifierMapper ().getProperties () );
630607 attributeContainer .getInFlightAccess ().applyIdClassAttributes ( attributes );
631608 }
632609 }
@@ -635,21 +612,19 @@ private <X> void applyVersionAttribute(PersistentClass persistentClass, EntityDo
635612 final Property declaredVersion = persistentClass .getDeclaredVersion ();
636613 if ( declaredVersion != null ) {
637614 @ SuppressWarnings ("unchecked" )
638- final AttributeContainer <X > attributeContainer = (AttributeContainer <X >) jpaEntityType ;
639- attributeContainer .getInFlightAccess ().applyVersionAttribute (
640- attributeFactory .buildVersionAttribute ( jpaEntityType , declaredVersion )
641- );
615+ final var attributeContainer = (AttributeContainer <X >) jpaEntityType ;
616+ attributeContainer .getInFlightAccess ()
617+ .applyVersionAttribute ( attributeFactory .buildVersionAttribute ( jpaEntityType , declaredVersion ) );
642618 }
643619 }
644620
645621 private <X > void applyVersionAttribute (MappedSuperclass mappingType , MappedSuperclassDomainType <X > jpaMappingType ) {
646622 final Property declaredVersion = mappingType .getDeclaredVersion ();
647623 if ( declaredVersion != null ) {
648624 @ SuppressWarnings ("unchecked" )
649- final AttributeContainer <X > xAttributeContainer = (AttributeContainer <X >) jpaMappingType ;
650- xAttributeContainer .getInFlightAccess ().applyVersionAttribute (
651- attributeFactory .buildVersionAttribute ( jpaMappingType , declaredVersion )
652- );
625+ final var attributeContainer = (AttributeContainer <X >) jpaMappingType ;
626+ attributeContainer .getInFlightAccess ()
627+ .applyVersionAttribute ( attributeFactory .buildVersionAttribute ( jpaMappingType , declaredVersion ) );
653628 }
654629 }
655630
@@ -661,7 +636,7 @@ private <X> void applyGenericProperties(PersistentClass persistentClass, EntityD
661636 final Property property = persistentClass .getProperty ( superclassProperty .getName () );
662637 final PersistentAttribute <X , ?> attribute = attributeFactory .buildAttribute ( entityType , property );
663638 @ SuppressWarnings ("unchecked" )
664- final AttributeContainer < X > attributeContainer = (AttributeContainer <X >) entityType ;
639+ final var attributeContainer = (AttributeContainer <X >) entityType ;
665640 attributeContainer .getInFlightAccess ().addConcreteGenericAttribute ( attribute );
666641 }
667642 }
@@ -682,9 +657,9 @@ private MappedSuperclass getMappedSuperclass(PersistentClass persistentClass) {
682657
683658 private MappedSuperclass getMappedSuperclass (MappedSuperclass mappedSuperclass ) {
684659 final MappedSuperclass superMappedSuperclass = mappedSuperclass .getSuperMappedSuperclass ();
685- return superMappedSuperclass ! = null
686- ? superMappedSuperclass
687- : getMappedSuperclass ( mappedSuperclass . getSuperPersistentClass () ) ;
660+ return superMappedSuperclass = = null
661+ ? getMappedSuperclass ( mappedSuperclass . getSuperPersistentClass () )
662+ : superMappedSuperclass ;
688663 }
689664
690665 private Property getMappedSuperclassProperty (String propertyName , MappedSuperclass mappedSuperclass ) {
@@ -731,7 +706,8 @@ private <X> void populateStaticMetamodel(ManagedDomainType<X> managedType, Set<S
731706 && processedMetamodelClassName .add ( metamodelClassName ( managedType ) ) ) {
732707 final Class <?> metamodelClass = metamodelClass ( managedType );
733708 if ( metamodelClass != null ) {
734- populateMetamodelClass ( managedType , metamodelClass );
709+ registerAttributes ( metamodelClass , managedType );
710+ injectManagedType ( managedType , metamodelClass );
735711 }
736712 // todo : this does not account for @MappedSuperclass, mainly
737713 // because this is not being tracked in our internal
@@ -743,11 +719,6 @@ private <X> void populateStaticMetamodel(ManagedDomainType<X> managedType, Set<S
743719 }
744720 }
745721
746- private <X > void populateMetamodelClass (ManagedDomainType <X > managedType , Class <?> metamodelClass ) {
747- registerAttributes ( metamodelClass , managedType );
748- injectManagedType ( managedType , metamodelClass );
749- }
750-
751722 private static <X > void injectManagedType (ManagedDomainType <X > managedType , Class <?> metamodelClass ) {
752723 try {
753724 injectField ( metamodelClass , "class_" , managedType , false );
@@ -788,17 +759,15 @@ private <X> void registerAttributes(Class<?> metamodelClass, ManagedDomainType<X
788759 registerAttribute ( metamodelClass , attribute );
789760 }
790761
791- if ( managedType instanceof IdentifiableType ) {
792- final AbstractIdentifiableType <X > entityType = (AbstractIdentifiableType <X >) managedType ;
793-
762+ if ( managedType instanceof AbstractIdentifiableType <X > entityType ) {
794763 // handle version
795764 if ( entityType .hasDeclaredVersionAttribute () ) {
796765 registerAttribute ( metamodelClass , entityType .getDeclaredVersion () );
797766 }
798767
799768 // handle id-class mappings specially
800769 if ( entityType .hasIdClass () ) {
801- final Set < SingularPersistentAttribute <? super X , ?>> attributes = entityType .getIdClassAttributesSafely ();
770+ final var attributes = entityType .getIdClassAttributesSafely ();
802771 if ( attributes != null ) {
803772 for ( SingularAttribute <? super X , ?> attribute : attributes ) {
804773 registerAttribute ( metamodelClass , attribute );
@@ -833,7 +802,6 @@ private <X> void registerAttribute(Class<?> metamodelClass, Attribute<X, ?> attr
833802 }
834803 }
835804
836-
837805 public MappedSuperclassDomainType <?> locateMappedSuperclassType (MappedSuperclass mappedSuperclass ) {
838806 return mappedSuperclassByMappedSuperclassMapping .get ( mappedSuperclass );
839807 }
@@ -874,22 +842,24 @@ public <J> BasicDomainType<J> resolveBasicType(Class<J> javaType) {
874842 if ( domainType == null ) {
875843 // we cannot use getTypeConfiguration().standardBasicTypeForJavaType(javaType)
876844 // because that doesn't return the right thing for primitive types
877- final JavaType <J > javaTypeDescriptor =
878- getTypeConfiguration ().getJavaTypeRegistry ().resolveDescriptor ( javaType );
879- final JdbcType jdbcType =
880- javaTypeDescriptor .getRecommendedJdbcType ( typeConfiguration .getCurrentBaseSqlTypeIndicators () );
881- final BasicDomainType <J > type =
882- javaType .isPrimitive ()
883- ? new PrimitiveBasicTypeImpl <>( javaTypeDescriptor , jdbcType , javaType )
884- : new BasicTypeImpl <>( javaTypeDescriptor , jdbcType );
885- basicDomainTypeMap .put ( javaType , type );
886- return type ;
845+ basicDomainTypeMap .put ( javaType , basicDomainType ( javaType ) );
846+ return basicDomainType ( javaType );
887847 }
888848 else {
889849 return domainType ;
890850 }
891851 }
892852
853+ private <J > BasicDomainType <J > basicDomainType (Class <J > javaType ) {
854+ final JavaType <J > javaTypeDescriptor =
855+ getTypeConfiguration ().getJavaTypeRegistry ().resolveDescriptor ( javaType );
856+ final JdbcType jdbcType =
857+ javaTypeDescriptor .getRecommendedJdbcType ( typeConfiguration .getCurrentBaseSqlTypeIndicators () );
858+ return javaType .isPrimitive ()
859+ ? new PrimitiveBasicTypeImpl <>( javaTypeDescriptor , jdbcType , javaType )
860+ : new BasicTypeImpl <>( javaTypeDescriptor , jdbcType );
861+ }
862+
893863 public <J > EmbeddableDomainType <J > locateEmbeddable (Class <J > embeddableClass , Component component ) {
894864 //noinspection unchecked
895865 EmbeddableDomainType <J > domainType = (EmbeddableDomainType <J >) embeddables .get ( embeddableClass );
0 commit comments