diff --git a/hibernate-core/src/main/java/org/hibernate/boot/model/process/spi/MetadataBuildingProcess.java b/hibernate-core/src/main/java/org/hibernate/boot/model/process/spi/MetadataBuildingProcess.java index ae0d12f568a5..0580812837bd 100644 --- a/hibernate-core/src/main/java/org/hibernate/boot/model/process/spi/MetadataBuildingProcess.java +++ b/hibernate-core/src/main/java/org/hibernate/boot/model/process/spi/MetadataBuildingProcess.java @@ -49,6 +49,7 @@ import org.hibernate.boot.model.source.internal.hbm.ModelBinder; import org.hibernate.boot.model.source.spi.MetadataSourceProcessor; import org.hibernate.boot.models.internal.DomainModelCategorizationCollector; +import org.hibernate.boot.models.xml.spi.PersistenceUnitMetadata; import org.hibernate.boot.models.xml.spi.XmlPreProcessingResult; import org.hibernate.boot.models.xml.spi.XmlPreProcessor; import org.hibernate.boot.models.xml.spi.XmlProcessingResult; @@ -373,14 +374,13 @@ public static DomainModelSource processManagedResources( // - allKnownClassNames (technically could be included in xmlPreProcessingResult) // - sourceModelBuildingContext + final PersistenceUnitMetadata aggregatedPersistenceUnitMetadata = metadataCollector.getPersistenceUnitMetadata(); final SourceModelBuildingContext modelsContext = bootstrapContext.getModelsContext(); final XmlPreProcessingResult xmlPreProcessingResult = XmlPreProcessor.preProcessXmlResources( managedResources, - metadataCollector.getPersistenceUnitMetadata() + aggregatedPersistenceUnitMetadata ); - assert metadataCollector.getPersistenceUnitMetadata() == xmlPreProcessingResult.getPersistenceUnitMetadata(); - final List allKnownClassNames = mutableJoin( managedResources.getAnnotatedClassReferences().stream().map( Class::getName ).collect( Collectors.toList() ), managedResources.getAnnotatedClassNames(), @@ -413,22 +413,20 @@ public static DomainModelSource processManagedResources( // - mappedSuperClasses // - embeddables - // JPA id generator global-ity thing - final boolean areIdGeneratorsGlobal = true; final ClassDetailsRegistry classDetailsRegistry = modelsContext.getClassDetailsRegistry(); final DomainModelCategorizationCollector modelCategorizationCollector = new DomainModelCategorizationCollector( - areIdGeneratorsGlobal, metadataCollector.getGlobalRegistrations(), modelsContext ); final RootMappingDefaults rootMappingDefaults = new RootMappingDefaults( optionDefaults, - xmlPreProcessingResult.getPersistenceUnitMetadata() + aggregatedPersistenceUnitMetadata ); final XmlProcessingResult xmlProcessingResult = XmlProcessor.processXml( xmlPreProcessingResult, - modelCategorizationCollector, + aggregatedPersistenceUnitMetadata, + modelCategorizationCollector::apply, modelsContext, bootstrapContext, rootMappingDefaults @@ -448,14 +446,14 @@ public static DomainModelSource processManagedResources( modelCategorizationCollector ) ); - xmlProcessingResult.apply( xmlPreProcessingResult.getPersistenceUnitMetadata() ); + xmlProcessingResult.apply(); return new DomainModelSource( classDetailsRegistry, allKnownClassNames, modelCategorizationCollector.getGlobalRegistrations(), rootMappingDefaults, - xmlPreProcessingResult.getPersistenceUnitMetadata() + aggregatedPersistenceUnitMetadata ); } diff --git a/hibernate-core/src/main/java/org/hibernate/boot/model/source/internal/OverriddenMappingDefaults.java b/hibernate-core/src/main/java/org/hibernate/boot/model/source/internal/OverriddenMappingDefaults.java index 9d5f8a1f8c05..938e7c0cbf6e 100644 --- a/hibernate-core/src/main/java/org/hibernate/boot/model/source/internal/OverriddenMappingDefaults.java +++ b/hibernate-core/src/main/java/org/hibernate/boot/model/source/internal/OverriddenMappingDefaults.java @@ -170,6 +170,7 @@ public Builder(EffectiveMappingDefaults parentDefaults) { this.autoImportEnabled = parentDefaults.isDefaultAutoImport(); this.implicitCascadeTypes = parentDefaults.getDefaultCascadeTypes(); + this.implicitPropertyAccessType = parentDefaults.getDefaultPropertyAccessType(); this.implicitPropertyAccessorName = parentDefaults.getDefaultAccessStrategyName(); this.entitiesImplicitlyLazy = parentDefaults.isDefaultEntityLaziness(); this.pluralAttributesImplicitlyLazy = parentDefaults.isDefaultCollectionLaziness(); diff --git a/hibernate-core/src/main/java/org/hibernate/boot/models/internal/DomainModelCategorizationCollector.java b/hibernate-core/src/main/java/org/hibernate/boot/models/internal/DomainModelCategorizationCollector.java index b446c31ab1cc..6b7d86e57f4c 100644 --- a/hibernate-core/src/main/java/org/hibernate/boot/models/internal/DomainModelCategorizationCollector.java +++ b/hibernate-core/src/main/java/org/hibernate/boot/models/internal/DomainModelCategorizationCollector.java @@ -29,8 +29,6 @@ * @author Steve Ebersole */ public class DomainModelCategorizationCollector { - private final boolean areIdGeneratorsGlobal; - private final GlobalRegistrationsImpl globalRegistrations; private final SourceModelBuildingContext modelsContext; @@ -39,10 +37,8 @@ public class DomainModelCategorizationCollector { private final Map embeddables = new HashMap<>(); public DomainModelCategorizationCollector( - boolean areIdGeneratorsGlobal, GlobalRegistrations globalRegistrations, SourceModelBuildingContext modelsContext) { - this.areIdGeneratorsGlobal = areIdGeneratorsGlobal; this.globalRegistrations = (GlobalRegistrationsImpl) globalRegistrations; this.modelsContext = modelsContext; } diff --git a/hibernate-core/src/main/java/org/hibernate/boot/models/package-info.java b/hibernate-core/src/main/java/org/hibernate/boot/models/package-info.java index efddaa4ff474..2a1709230cad 100644 --- a/hibernate-core/src/main/java/org/hibernate/boot/models/package-info.java +++ b/hibernate-core/src/main/java/org/hibernate/boot/models/package-info.java @@ -9,6 +9,11 @@ * building the {@code hibernate-models} model ({@linkplain org.hibernate.models.spi.ClassDetails}, etc.) * to ultimately be bound into Hibernate's {@linkplain org.hibernate.mapping boot-time model}. * + * @apiNote This entire package is considered incubating + * * @author Steve Ebersole */ +@Incubating package org.hibernate.boot.models; + +import org.hibernate.Incubating; diff --git a/hibernate-core/src/main/java/org/hibernate/boot/models/spi/JpaEventListener.java b/hibernate-core/src/main/java/org/hibernate/boot/models/spi/JpaEventListener.java index ac2300f3a024..da78327cabd7 100644 --- a/hibernate-core/src/main/java/org/hibernate/boot/models/spi/JpaEventListener.java +++ b/hibernate-core/src/main/java/org/hibernate/boot/models/spi/JpaEventListener.java @@ -41,6 +41,14 @@ * @see JaxbEntityListenerImpl * @see GlobalRegistrations#getEntityListenerRegistrations() * + * @see jakarta.persistence.PostLoad + * @see jakarta.persistence.PostPersist + * @see jakarta.persistence.PostRemove + * @see jakarta.persistence.PostUpdate + * @see jakarta.persistence.PrePersist + * @see jakarta.persistence.PreRemove + * @see jakarta.persistence.PreUpdate + * * @author Steve Ebersole */ public class JpaEventListener { @@ -59,7 +67,7 @@ public class JpaEventListener { private final MethodDetails postLoadMethod; - private JpaEventListener( + public JpaEventListener( JpaEventListenerStyle consumerType, ClassDetails listenerClass, MethodDetails prePersistMethod, diff --git a/hibernate-core/src/main/java/org/hibernate/boot/models/xml/internal/XmlDocumentImpl.java b/hibernate-core/src/main/java/org/hibernate/boot/models/xml/internal/XmlDocumentImpl.java index 3b90e98d8d6a..d435c457b4f7 100644 --- a/hibernate-core/src/main/java/org/hibernate/boot/models/xml/internal/XmlDocumentImpl.java +++ b/hibernate-core/src/main/java/org/hibernate/boot/models/xml/internal/XmlDocumentImpl.java @@ -4,11 +4,8 @@ */ package org.hibernate.boot.models.xml.internal; -import java.util.Collections; -import java.util.HashMap; -import java.util.List; -import java.util.Map; - +import jakarta.persistence.AccessType; +import org.hibernate.boot.jaxb.Origin; import org.hibernate.boot.jaxb.hbm.spi.JaxbHbmNamedNativeQueryType; import org.hibernate.boot.jaxb.hbm.spi.JaxbHbmNamedQueryType; import org.hibernate.boot.jaxb.mapping.spi.JaxbCollectionUserTypeRegistrationImpl; @@ -22,15 +19,19 @@ import org.hibernate.boot.jaxb.mapping.spi.JaxbJavaTypeRegistrationImpl; import org.hibernate.boot.jaxb.mapping.spi.JaxbJdbcTypeRegistrationImpl; import org.hibernate.boot.jaxb.mapping.spi.JaxbMappedSuperclassImpl; -import org.hibernate.boot.jaxb.mapping.spi.JaxbNamedNativeQueryImpl; import org.hibernate.boot.jaxb.mapping.spi.JaxbNamedHqlQueryImpl; +import org.hibernate.boot.jaxb.mapping.spi.JaxbNamedNativeQueryImpl; import org.hibernate.boot.jaxb.mapping.spi.JaxbNamedStoredProcedureQueryImpl; import org.hibernate.boot.jaxb.mapping.spi.JaxbUserTypeRegistrationImpl; +import org.hibernate.boot.jaxb.spi.Binding; import org.hibernate.boot.models.xml.spi.PersistenceUnitMetadata; import org.hibernate.boot.models.xml.spi.XmlDocument; import org.hibernate.internal.util.NullnessHelper; -import jakarta.persistence.AccessType; +import java.util.Collections; +import java.util.HashMap; +import java.util.List; +import java.util.Map; import static org.hibernate.internal.util.collections.CollectionHelper.isEmpty; @@ -38,6 +39,8 @@ * @author Steve Ebersole */ public class XmlDocumentImpl implements XmlDocument { + private final Origin origin; + private final JaxbEntityMappingsImpl root; private final DefaultsImpl defaults; private final List entityMappings; private final List mappedSuperclassMappings; @@ -57,6 +60,8 @@ public class XmlDocumentImpl implements XmlDocument { private final Map namedStoredProcedureQueries; private XmlDocumentImpl( + Origin origin, + JaxbEntityMappingsImpl root, DefaultsImpl defaults, List entityMappings, List mappedSuperclassMappings, @@ -74,6 +79,8 @@ private XmlDocumentImpl( Map namedStoredProcedureQueries, Map hibernateNamedQueries, Map hibernateNamedNativeQueries) { + this.origin = origin; + this.root = root; this.defaults = defaults; this.entityMappings = entityMappings; this.mappedSuperclassMappings = mappedSuperclassMappings; @@ -93,6 +100,16 @@ private XmlDocumentImpl( this.hibernateNamedNativeQueries = hibernateNamedNativeQueries; } + @Override + public Origin getOrigin() { + return origin; + } + + @Override + public JaxbEntityMappingsImpl getRoot() { + return root; + } + @Override public Defaults getDefaults() { return defaults; @@ -252,8 +269,11 @@ static DefaultsImpl consume(JaxbEntityMappingsImpl jaxbRoot, PersistenceUnitMeta } } - public static XmlDocumentImpl consume(JaxbEntityMappingsImpl jaxbRoot, PersistenceUnitMetadata metadata) { + public static XmlDocumentImpl consume(Binding xmlBinding, PersistenceUnitMetadata metadata) { + final JaxbEntityMappingsImpl jaxbRoot = xmlBinding.getRoot(); return new XmlDocumentImpl( + xmlBinding.getOrigin(), + xmlBinding.getRoot(), DefaultsImpl.consume( jaxbRoot, metadata ), jaxbRoot.getEntities(), jaxbRoot.getMappedSuperclasses(), diff --git a/hibernate-core/src/main/java/org/hibernate/boot/models/xml/internal/XmlPreProcessingResultImpl.java b/hibernate-core/src/main/java/org/hibernate/boot/models/xml/internal/XmlPreProcessingResultImpl.java index 79e577a14d40..8d8dcf68f942 100644 --- a/hibernate-core/src/main/java/org/hibernate/boot/models/xml/internal/XmlPreProcessingResultImpl.java +++ b/hibernate-core/src/main/java/org/hibernate/boot/models/xml/internal/XmlPreProcessingResultImpl.java @@ -8,7 +8,9 @@ import java.util.List; import org.hibernate.boot.jaxb.mapping.spi.JaxbEntityMappingsImpl; +import org.hibernate.boot.jaxb.spi.Binding; import org.hibernate.boot.models.xml.spi.PersistenceUnitMetadata; +import org.hibernate.boot.models.xml.spi.XmlDocument; import org.hibernate.boot.models.xml.spi.XmlPreProcessingResult; import org.hibernate.internal.util.StringHelper; @@ -17,7 +19,7 @@ */ public class XmlPreProcessingResultImpl implements XmlPreProcessingResult { private final PersistenceUnitMetadataImpl persistenceUnitMetadata; - private final List documents = new ArrayList<>(); + private final List documents = new ArrayList<>(); private final List managedClasses = new ArrayList<>(); private final List managedNames = new ArrayList<>(); @@ -36,13 +38,12 @@ public XmlPreProcessingResultImpl() { this( new PersistenceUnitMetadataImpl() ); } - @Override public PersistenceUnitMetadataImpl getPersistenceUnitMetadata() { return persistenceUnitMetadata; } @Override - public List getDocuments() { + public List getDocuments() { return documents; } @@ -56,23 +57,26 @@ public List getMappedNames() { return managedNames; } - public void addDocument(JaxbEntityMappingsImpl document) { - persistenceUnitMetadata.apply( document.getPersistenceUnitMetadata() ); - documents.add( document ); - document.getEmbeddables().forEach( (jaxbEmbeddable) -> { + public void addDocument(Binding binding) { + final XmlDocumentImpl xmlDocument = XmlDocumentImpl.consume( binding, persistenceUnitMetadata ); + documents.add( xmlDocument ); + + final JaxbEntityMappingsImpl jaxbRoot = binding.getRoot(); + persistenceUnitMetadata.apply( jaxbRoot.getPersistenceUnitMetadata() ); + jaxbRoot.getEmbeddables().forEach( (jaxbEmbeddable) -> { if ( StringHelper.isNotEmpty( jaxbEmbeddable.getClazz() ) ) { - managedClasses.add( XmlProcessingHelper.determineClassName( document, jaxbEmbeddable ) ); + managedClasses.add( XmlProcessingHelper.determineClassName( jaxbRoot, jaxbEmbeddable ) ); } else if ( StringHelper.isNotEmpty( jaxbEmbeddable.getName() ) ) { managedNames.add( jaxbEmbeddable.getName() ); } } ); - document.getMappedSuperclasses().forEach( (jaxbMappedSuperclass) -> { - managedClasses.add( XmlProcessingHelper.determineClassName( document, jaxbMappedSuperclass ) ); + jaxbRoot.getMappedSuperclasses().forEach( (jaxbMappedSuperclass) -> { + managedClasses.add( XmlProcessingHelper.determineClassName( jaxbRoot, jaxbMappedSuperclass ) ); } ); - document.getEntities().forEach( (jaxbEntity) -> { + jaxbRoot.getEntities().forEach( (jaxbEntity) -> { if ( StringHelper.isNotEmpty( jaxbEntity.getClazz() ) ) { - managedClasses.add( XmlProcessingHelper.determineClassName( document, jaxbEntity ) ); + managedClasses.add( XmlProcessingHelper.determineClassName( jaxbRoot, jaxbEntity ) ); } else if ( StringHelper.isNotEmpty( jaxbEntity.getName() ) ) { managedNames.add( jaxbEntity.getName() ); diff --git a/hibernate-core/src/main/java/org/hibernate/boot/models/xml/internal/XmlProcessingResultImpl.java b/hibernate-core/src/main/java/org/hibernate/boot/models/xml/internal/XmlProcessingResultImpl.java index 31c9a9051b16..d623f3b28a04 100644 --- a/hibernate-core/src/main/java/org/hibernate/boot/models/xml/internal/XmlProcessingResultImpl.java +++ b/hibernate-core/src/main/java/org/hibernate/boot/models/xml/internal/XmlProcessingResultImpl.java @@ -10,7 +10,6 @@ import org.hibernate.boot.jaxb.mapping.spi.JaxbEmbeddableImpl; import org.hibernate.boot.jaxb.mapping.spi.JaxbEntityImpl; import org.hibernate.boot.jaxb.mapping.spi.JaxbMappedSuperclassImpl; -import org.hibernate.boot.models.xml.spi.PersistenceUnitMetadata; import org.hibernate.boot.models.xml.spi.XmlProcessingResult; /** @@ -34,7 +33,7 @@ public void addEmbeddableOverride(OverrideTuple overrideTupl } @Override - public void apply(PersistenceUnitMetadata metadata) { + public void apply() { ManagedTypeProcessor.processOverrideEmbeddable( getEmbeddableOverrides() ); ManagedTypeProcessor.processOverrideMappedSuperclass( getMappedSuperclassesOverrides() ); diff --git a/hibernate-core/src/main/java/org/hibernate/boot/models/xml/internal/attr/ElementCollectionAttributeProcessing.java b/hibernate-core/src/main/java/org/hibernate/boot/models/xml/internal/attr/ElementCollectionAttributeProcessing.java index 1958c2e60afd..83e2edddc222 100644 --- a/hibernate-core/src/main/java/org/hibernate/boot/models/xml/internal/attr/ElementCollectionAttributeProcessing.java +++ b/hibernate-core/src/main/java/org/hibernate/boot/models/xml/internal/attr/ElementCollectionAttributeProcessing.java @@ -11,6 +11,7 @@ import org.hibernate.boot.models.annotations.internal.CollectionTableJpaAnnotation; import org.hibernate.boot.models.annotations.internal.ElementCollectionJpaAnnotation; import org.hibernate.boot.models.annotations.internal.TargetXmlAnnotation; +import org.hibernate.boot.models.xml.internal.SimpleTypeInterpretation; import org.hibernate.boot.models.xml.internal.XmlAnnotationHelper; import org.hibernate.boot.models.xml.internal.XmlProcessingHelper; import org.hibernate.boot.models.xml.spi.XmlDocumentContext; @@ -53,7 +54,7 @@ public static MutableMemberDetails processElementCollectionAttribute( elementCollectionUsage.fetch( jaxbElementCollection.getFetch() ); } - applyTarget( jaxbElementCollection, xmlDocumentContext, memberDetails ); + applyElementCollectionElementType( jaxbElementCollection, elementCollectionUsage, memberDetails, xmlDocumentContext ); // NOTE: it is important that this happens before the `CommonPluralAttributeProcessing#applyPluralAttributeStructure` // call below @@ -91,6 +92,22 @@ public static MutableMemberDetails processElementCollectionAttribute( return memberDetails; } + private static void applyElementCollectionElementType( + JaxbElementCollectionImpl jaxbElementCollection, + ElementCollectionJpaAnnotation elementCollectionUsage, + MutableMemberDetails memberDetails, + XmlDocumentContext xmlDocumentContext) { + if ( StringHelper.isNotEmpty( jaxbElementCollection.getTargetClass() ) ) { + final SimpleTypeInterpretation simpleTypeInterpretation = SimpleTypeInterpretation.interpret( jaxbElementCollection.getTargetClass() ); + if ( simpleTypeInterpretation != null ) { + elementCollectionUsage.targetClass( simpleTypeInterpretation.getJavaType() ); + return; + } + } + + applyTarget( jaxbElementCollection, xmlDocumentContext, memberDetails ); + } + private static void applyTarget( JaxbElementCollectionImpl jaxbElementCollection, XmlDocumentContext xmlDocumentContext, diff --git a/hibernate-core/src/main/java/org/hibernate/boot/models/xml/spi/XmlDocument.java b/hibernate-core/src/main/java/org/hibernate/boot/models/xml/spi/XmlDocument.java index 822857b17ae5..f11bd6177b9d 100644 --- a/hibernate-core/src/main/java/org/hibernate/boot/models/xml/spi/XmlDocument.java +++ b/hibernate-core/src/main/java/org/hibernate/boot/models/xml/spi/XmlDocument.java @@ -4,9 +4,8 @@ */ package org.hibernate.boot.models.xml.spi; -import java.util.List; -import java.util.Map; - +import jakarta.persistence.AccessType; +import org.hibernate.boot.jaxb.Origin; import org.hibernate.boot.jaxb.hbm.spi.JaxbHbmNamedNativeQueryType; import org.hibernate.boot.jaxb.hbm.spi.JaxbHbmNamedQueryType; import org.hibernate.boot.jaxb.mapping.spi.JaxbCollectionUserTypeRegistrationImpl; @@ -16,20 +15,26 @@ import org.hibernate.boot.jaxb.mapping.spi.JaxbEmbeddableImpl; import org.hibernate.boot.jaxb.mapping.spi.JaxbEmbeddableInstantiatorRegistrationImpl; import org.hibernate.boot.jaxb.mapping.spi.JaxbEntityImpl; +import org.hibernate.boot.jaxb.mapping.spi.JaxbEntityMappingsImpl; import org.hibernate.boot.jaxb.mapping.spi.JaxbJavaTypeRegistrationImpl; import org.hibernate.boot.jaxb.mapping.spi.JaxbJdbcTypeRegistrationImpl; import org.hibernate.boot.jaxb.mapping.spi.JaxbMappedSuperclassImpl; -import org.hibernate.boot.jaxb.mapping.spi.JaxbNamedNativeQueryImpl; import org.hibernate.boot.jaxb.mapping.spi.JaxbNamedHqlQueryImpl; +import org.hibernate.boot.jaxb.mapping.spi.JaxbNamedNativeQueryImpl; import org.hibernate.boot.jaxb.mapping.spi.JaxbNamedStoredProcedureQueryImpl; import org.hibernate.boot.jaxb.mapping.spi.JaxbUserTypeRegistrationImpl; -import jakarta.persistence.AccessType; +import java.util.List; +import java.util.Map; /** * @author Steve Ebersole */ public interface XmlDocument { + Origin getOrigin(); + + JaxbEntityMappingsImpl getRoot(); + List getEntityMappings(); List getMappedSuperclassMappings(); diff --git a/hibernate-core/src/main/java/org/hibernate/boot/models/xml/spi/XmlPreProcessingResult.java b/hibernate-core/src/main/java/org/hibernate/boot/models/xml/spi/XmlPreProcessingResult.java index 1d3074743e70..68330d2d7f61 100644 --- a/hibernate-core/src/main/java/org/hibernate/boot/models/xml/spi/XmlPreProcessingResult.java +++ b/hibernate-core/src/main/java/org/hibernate/boot/models/xml/spi/XmlPreProcessingResult.java @@ -4,26 +4,21 @@ */ package org.hibernate.boot.models.xml.spi; -import java.util.List; - -import org.hibernate.boot.jaxb.mapping.spi.JaxbEntityMappingsImpl; import org.hibernate.boot.jaxb.mapping.spi.JaxbManagedType; +import java.util.List; + /** * Result of {@linkplain XmlPreProcessor#preProcessXmlResources} * * @author Steve Ebersole */ public interface XmlPreProcessingResult { - /** - * Aggregated persistence unit defaults and metadata - */ - PersistenceUnitMetadata getPersistenceUnitMetadata(); /** * All XML documents (JAXB roots) */ - List getDocuments(); + List getDocuments(); /** * All classes named across all XML mappings diff --git a/hibernate-core/src/main/java/org/hibernate/boot/models/xml/spi/XmlPreProcessor.java b/hibernate-core/src/main/java/org/hibernate/boot/models/xml/spi/XmlPreProcessor.java index b42f5ca88dec..baeaf7f0b163 100644 --- a/hibernate-core/src/main/java/org/hibernate/boot/models/xml/spi/XmlPreProcessor.java +++ b/hibernate-core/src/main/java/org/hibernate/boot/models/xml/spi/XmlPreProcessor.java @@ -25,18 +25,20 @@ public class XmlPreProcessor { public static XmlPreProcessingResult preProcessXmlResources( ManagedResources managedResources, PersistenceUnitMetadata persistenceUnitMetadata) { - final XmlPreProcessingResultImpl collected = new XmlPreProcessingResultImpl( persistenceUnitMetadata ); + final XmlPreProcessingResultImpl result = new XmlPreProcessingResultImpl( persistenceUnitMetadata ); - for ( Binding mappingXmlBinding : managedResources.getXmlMappingBindings() ) { + for ( Binding xmlBinding : managedResources.getXmlMappingBindings() ) { // for now skip hbm.xml - final JaxbBindableMappingDescriptor root = mappingXmlBinding.getRoot(); + final JaxbBindableMappingDescriptor root = xmlBinding.getRoot(); if ( root instanceof JaxbHbmHibernateMapping ) { continue; } - final JaxbEntityMappingsImpl jaxbEntityMappings = (JaxbEntityMappingsImpl) root; - collected.addDocument( jaxbEntityMappings ); + + //noinspection unchecked + final Binding mappingXmlBinding = (Binding) xmlBinding; + result.addDocument( mappingXmlBinding ); } - return collected; + return result; } } diff --git a/hibernate-core/src/main/java/org/hibernate/boot/models/xml/spi/XmlProcessingResult.java b/hibernate-core/src/main/java/org/hibernate/boot/models/xml/spi/XmlProcessingResult.java index 2e0b37214314..59aae24e56b9 100644 --- a/hibernate-core/src/main/java/org/hibernate/boot/models/xml/spi/XmlProcessingResult.java +++ b/hibernate-core/src/main/java/org/hibernate/boot/models/xml/spi/XmlProcessingResult.java @@ -46,7 +46,7 @@ public M getManagedType() { } } - void apply(PersistenceUnitMetadata metadata); + void apply(); List> getEntityOverrides(); List> getMappedSuperclassesOverrides(); diff --git a/hibernate-core/src/main/java/org/hibernate/boot/models/xml/spi/XmlProcessor.java b/hibernate-core/src/main/java/org/hibernate/boot/models/xml/spi/XmlProcessor.java index f5e96978dd33..ded77400baa2 100644 --- a/hibernate-core/src/main/java/org/hibernate/boot/models/xml/spi/XmlProcessor.java +++ b/hibernate-core/src/main/java/org/hibernate/boot/models/xml/spi/XmlProcessor.java @@ -5,14 +5,15 @@ package org.hibernate.boot.models.xml.spi; import org.hibernate.boot.internal.RootMappingDefaults; -import org.hibernate.boot.models.internal.DomainModelCategorizationCollector; +import org.hibernate.boot.jaxb.mapping.spi.JaxbEntityMappingsImpl; import org.hibernate.boot.models.xml.internal.ManagedTypeProcessor; import org.hibernate.boot.models.xml.internal.XmlDocumentContextImpl; -import org.hibernate.boot.models.xml.internal.XmlDocumentImpl; import org.hibernate.boot.models.xml.internal.XmlProcessingResultImpl; import org.hibernate.boot.spi.BootstrapContext; import org.hibernate.models.spi.SourceModelBuildingContext; +import java.util.function.BiConsumer; + /** * Processes XML mappings - applying metadata-complete mappings and collecting * override mappings for later processing. @@ -22,25 +23,24 @@ public class XmlProcessor { public static XmlProcessingResult processXml( XmlPreProcessingResult xmlPreProcessingResult, - DomainModelCategorizationCollector modelCategorizationCollector, + PersistenceUnitMetadata persistenceUnitMetadata, + BiConsumer jaxbRootConsumer, SourceModelBuildingContext sourceModelBuildingContext, BootstrapContext bootstrapContext, RootMappingDefaults mappingDefaults) { - final boolean xmlMappingsGloballyComplete = xmlPreProcessingResult.getPersistenceUnitMetadata().areXmlMappingsComplete(); + final boolean xmlMappingsGloballyComplete = persistenceUnitMetadata.areXmlMappingsComplete(); final XmlProcessingResultImpl xmlOverlay = new XmlProcessingResultImpl(); - xmlPreProcessingResult.getDocuments().forEach( (jaxbRoot) -> { - final XmlDocumentImpl xmlDocument = XmlDocumentImpl.consume( - jaxbRoot, - xmlPreProcessingResult.getPersistenceUnitMetadata() - ); + xmlPreProcessingResult.getDocuments().forEach( (xmlDocument) -> { final XmlDocumentContext xmlDocumentContext = new XmlDocumentContextImpl( xmlDocument, mappingDefaults, sourceModelBuildingContext, bootstrapContext ); - modelCategorizationCollector.apply( jaxbRoot, xmlDocumentContext ); + + final JaxbEntityMappingsImpl jaxbRoot = xmlDocument.getRoot(); + jaxbRootConsumer.accept( jaxbRoot, xmlDocumentContext ); jaxbRoot.getEmbeddables().forEach( (jaxbEmbeddable) -> { if ( xmlMappingsGloballyComplete || jaxbEmbeddable.isMetadataComplete() == Boolean.TRUE ) { diff --git a/hibernate-core/src/test/java/org/hibernate/orm/test/annotations/xml/ejb3/Ejb3XmlTestCase.java b/hibernate-core/src/test/java/org/hibernate/orm/test/annotations/xml/ejb3/Ejb3XmlTestCase.java index 823610e9b942..ca15f29eb427 100644 --- a/hibernate-core/src/test/java/org/hibernate/orm/test/annotations/xml/ejb3/Ejb3XmlTestCase.java +++ b/hibernate-core/src/test/java/org/hibernate/orm/test/annotations/xml/ejb3/Ejb3XmlTestCase.java @@ -102,7 +102,6 @@ protected ClassDetails getClassDetails(Class entityClass, String xmlResourceN ); final DomainModelCategorizationCollector modelCategorizationCollector = new DomainModelCategorizationCollector( - true, globalRegistrations, modelBuildingContext ); @@ -115,13 +114,14 @@ protected ClassDetails getClassDetails(Class entityClass, String xmlResourceN final XmlProcessingResult xmlProcessingResult = XmlProcessor.processXml( xmlPreProcessingResult, - modelCategorizationCollector, + persistenceUnitMetadata, + modelCategorizationCollector::apply, modelBuildingContext, bootstrapContext, rootMappingDefaults ); - xmlProcessingResult.apply( persistenceUnitMetadata ); + xmlProcessingResult.apply(); return modelBuildingContext.getClassDetailsRegistry().resolveClassDetails( entityClass.getName() ); } diff --git a/hibernate-core/src/test/java/org/hibernate/orm/test/boot/models/SourceModelTestHelper.java b/hibernate-core/src/test/java/org/hibernate/orm/test/boot/models/SourceModelTestHelper.java index dbf2121e2e2d..33f83d6efe96 100644 --- a/hibernate-core/src/test/java/org/hibernate/orm/test/boot/models/SourceModelTestHelper.java +++ b/hibernate-core/src/test/java/org/hibernate/orm/test/boot/models/SourceModelTestHelper.java @@ -296,14 +296,14 @@ public static SourceModelBuildingContext createBuildingContext( final GlobalRegistrationsImpl globalRegistrations = new GlobalRegistrationsImpl( sourceModelBuildingContext, bootstrapContext ); final DomainModelCategorizationCollector modelCategorizationCollector = new DomainModelCategorizationCollector( - true, globalRegistrations, sourceModelBuildingContext ); final XmlProcessingResult xmlProcessingResult = XmlProcessor.processXml( xmlPreProcessingResult, - modelCategorizationCollector, + persistenceUnitMetadata, + modelCategorizationCollector::apply, sourceModelBuildingContext, bootstrapContext, rootMappingDefaults @@ -328,7 +328,7 @@ public static SourceModelBuildingContext createBuildingContext( } } ); - xmlProcessingResult.apply( xmlPreProcessingResult.getPersistenceUnitMetadata() ); + xmlProcessingResult.apply(); return sourceModelBuildingContext; } diff --git a/hibernate-core/src/test/java/org/hibernate/orm/test/boot/models/XmlHelper.java b/hibernate-core/src/test/java/org/hibernate/orm/test/boot/models/XmlHelper.java index e8db4f6f83fc..8b97c192bad2 100644 --- a/hibernate-core/src/test/java/org/hibernate/orm/test/boot/models/XmlHelper.java +++ b/hibernate-core/src/test/java/org/hibernate/orm/test/boot/models/XmlHelper.java @@ -24,6 +24,11 @@ * @author Steve Ebersole */ public class XmlHelper { + public static Binding bindMapping(String resourceName, ClassLoading classLoadingAccess) { + final JaxbEntityMappingsImpl jaxbRoot = loadMapping( resourceName, classLoadingAccess ); + return new Binding<>( jaxbRoot, new Origin( SourceType.RESOURCE, resourceName ) ); + } + public static JaxbEntityMappingsImpl loadMapping(String resourceName, ClassLoading classLoadingAccess) { final ResourceStreamLocatorImpl resourceStreamLocator = new ResourceStreamLocatorImpl( classLoadingAccess ); final MappingBinder mappingBinder = new MappingBinder( resourceStreamLocator, NON_VALIDATING ); @@ -34,25 +39,19 @@ public static JaxbEntityMappingsImpl loadMapping(String resourceName, ClassLoadi return (JaxbEntityMappingsImpl) binding.getRoot(); } - private static class ResourceStreamLocatorImpl implements ResourceStreamLocator { - private final ClassLoading classLoadingAccess; - - public ResourceStreamLocatorImpl(ClassLoading classLoadingAccess) { - this.classLoadingAccess = classLoadingAccess; - } - - @Override - public InputStream locateResourceStream(String resourceName) { - final URL resource = classLoadingAccess.locateResource( resourceName ); - if ( resource == null ) { - throw new XmlResourceException( "Could not locate XML mapping resource - " + resourceName ); - } - try { - return resource.openStream(); - } - catch (IOException e) { - throw new XmlResourceException( "Could not open XML mapping resource stream - " + resourceName, e ); + private record ResourceStreamLocatorImpl(ClassLoading classLoadingAccess) implements ResourceStreamLocator { + @Override + public InputStream locateResourceStream(String resourceName) { + final URL resource = classLoadingAccess.locateResource( resourceName ); + if ( resource == null ) { + throw new XmlResourceException( "Could not locate XML mapping resource - " + resourceName ); + } + try { + return resource.openStream(); + } + catch (IOException e) { + throw new XmlResourceException( "Could not open XML mapping resource stream - " + resourceName, e ); + } } } - } } diff --git a/hibernate-core/src/test/java/org/hibernate/orm/test/boot/models/xml/XmlProcessingSmokeTests.java b/hibernate-core/src/test/java/org/hibernate/orm/test/boot/models/xml/XmlProcessingSmokeTests.java index f20d4e8ce43e..b9373ceaf1ad 100644 --- a/hibernate-core/src/test/java/org/hibernate/orm/test/boot/models/xml/XmlProcessingSmokeTests.java +++ b/hibernate-core/src/test/java/org/hibernate/orm/test/boot/models/xml/XmlProcessingSmokeTests.java @@ -4,12 +4,12 @@ */ package org.hibernate.orm.test.boot.models.xml; -import java.util.List; -import java.util.Map; - import org.hibernate.boot.internal.MetadataBuilderImpl; import org.hibernate.boot.internal.RootMappingDefaults; +import org.hibernate.boot.jaxb.Origin; +import org.hibernate.boot.jaxb.SourceType; import org.hibernate.boot.jaxb.mapping.spi.JaxbEntityMappingsImpl; +import org.hibernate.boot.jaxb.spi.Binding; import org.hibernate.boot.models.internal.DomainModelCategorizationCollector; import org.hibernate.boot.models.internal.GlobalRegistrationsImpl; import org.hibernate.boot.models.spi.FilterDefRegistration; @@ -22,13 +22,15 @@ import org.hibernate.models.spi.SourceModelBuildingContext; import org.hibernate.orm.test.boot.models.SourceModelTestHelper; import org.hibernate.orm.test.boot.models.XmlHelper; -import org.hibernate.type.descriptor.jdbc.ClobJdbcType; - import org.hibernate.testing.boot.BootstrapContextImpl; import org.hibernate.testing.orm.junit.ServiceRegistry; import org.hibernate.testing.orm.junit.ServiceRegistryScope; +import org.hibernate.type.descriptor.jdbc.ClobJdbcType; import org.junit.jupiter.api.Test; +import java.util.List; +import java.util.Map; + import static jakarta.persistence.AccessType.FIELD; import static org.assertj.core.api.Assertions.assertThat; import static org.hibernate.annotations.CascadeType.LOCK; @@ -43,15 +45,15 @@ public class XmlProcessingSmokeTests { @Test void testGlobals() { final XmlPreProcessingResultImpl collector = new XmlPreProcessingResultImpl(); - collector.addDocument( XmlHelper.loadMapping( "mappings/models/globals.xml", SIMPLE_CLASS_LOADING ) ); + collector.addDocument( XmlHelper.bindMapping( "mappings/models/globals.xml", SIMPLE_CLASS_LOADING ) ); } @Test void testPersistenceUnitDefaults1() { final XmlPreProcessingResultImpl collector = new XmlPreProcessingResultImpl(); - final JaxbEntityMappingsImpl simple1 = XmlHelper.loadMapping( "mappings/models/simple1.xml", SIMPLE_CLASS_LOADING ); - final JaxbEntityMappingsImpl simple2 = XmlHelper.loadMapping( "mappings/models/simple2.xml", SIMPLE_CLASS_LOADING ); + final Binding simple1 = XmlHelper.bindMapping( "mappings/models/simple1.xml", SIMPLE_CLASS_LOADING ); + final Binding simple2 = XmlHelper.bindMapping( "mappings/models/simple2.xml", SIMPLE_CLASS_LOADING ); collector.addDocument( simple1 ); collector.addDocument( simple2); @@ -75,8 +77,8 @@ void testPersistenceUnitDefaults1() { void testPersistenceUnitDefaults2() { final XmlPreProcessingResultImpl collector = new XmlPreProcessingResultImpl(); - collector.addDocument( XmlHelper.loadMapping( "mappings/models/simple2.xml", SIMPLE_CLASS_LOADING ) ); - collector.addDocument( XmlHelper.loadMapping( "mappings/models/simple1.xml", SIMPLE_CLASS_LOADING ) ); + collector.addDocument( XmlHelper.bindMapping( "mappings/models/simple2.xml", SIMPLE_CLASS_LOADING ) ); + collector.addDocument( XmlHelper.bindMapping( "mappings/models/simple1.xml", SIMPLE_CLASS_LOADING ) ); final PersistenceUnitMetadata metadata = collector.getPersistenceUnitMetadata(); // xml-mappings-complete is a gated flag - once we see a true, it should always be considered true @@ -98,8 +100,8 @@ void testPersistenceUnitDefaults2() { void testSimpleXmlDocumentBuilding() { final XmlPreProcessingResultImpl collector = new XmlPreProcessingResultImpl(); - final JaxbEntityMappingsImpl simple1 = XmlHelper.loadMapping( "mappings/models/simple1.xml", SIMPLE_CLASS_LOADING ); - final JaxbEntityMappingsImpl simple2 = XmlHelper.loadMapping( "mappings/models/simple2.xml", SIMPLE_CLASS_LOADING ); + final Binding simple1 = XmlHelper.bindMapping( "mappings/models/simple1.xml", SIMPLE_CLASS_LOADING ); + final Binding simple2 = XmlHelper.bindMapping( "mappings/models/simple2.xml", SIMPLE_CLASS_LOADING ); collector.addDocument( simple1 ); collector.addDocument( simple2 ); @@ -127,16 +129,16 @@ void testSimpleGlobalXmlProcessing(ServiceRegistryScope scope) { final XmlPreProcessingResultImpl collectedXmlResources = new XmlPreProcessingResultImpl(); final JaxbEntityMappingsImpl xmlMapping = XmlHelper.loadMapping( "mappings/models/globals.xml", SIMPLE_CLASS_LOADING ); - collectedXmlResources.addDocument( xmlMapping ); + final Binding binding = new Binding<>( xmlMapping, new Origin( SourceType.RESOURCE, "mappings/models/globals.xml" ) ); + collectedXmlResources.addDocument( binding ); final DomainModelCategorizationCollector collector = new DomainModelCategorizationCollector( - false, new GlobalRegistrationsImpl( buildingContext, new BootstrapContextImpl() ), buildingContext ); - collectedXmlResources.getDocuments().forEach( jaxbEntityMappings -> { + collectedXmlResources.getDocuments().forEach( xmlDocument -> { final XmlDocumentContextImpl xmlDocumentContext = new XmlDocumentContextImpl( - XmlDocumentImpl.consume( jaxbEntityMappings, collectedXmlResources.getPersistenceUnitMetadata() ), + xmlDocument, new RootMappingDefaults( new MetadataBuilderImpl.MappingDefaultsImpl( scope.getRegistry() ), collectedXmlResources.getPersistenceUnitMetadata() @@ -144,7 +146,7 @@ void testSimpleGlobalXmlProcessing(ServiceRegistryScope scope) { buildingContext, new BootstrapContextImpl() ); - collector.apply( jaxbEntityMappings, xmlDocumentContext ); + collector.apply( xmlMapping, xmlDocumentContext ); } ); final GlobalRegistrationsImpl globalRegistrations = collector.getGlobalRegistrations(); diff --git a/hibernate-core/src/test/java/org/hibernate/orm/test/boot/models/xml/dynamic/DynamicModelTests.java b/hibernate-core/src/test/java/org/hibernate/orm/test/boot/models/xml/dynamic/DynamicModelTests.java index 3965edebe94a..6f07ded55773 100644 --- a/hibernate-core/src/test/java/org/hibernate/orm/test/boot/models/xml/dynamic/DynamicModelTests.java +++ b/hibernate-core/src/test/java/org/hibernate/orm/test/boot/models/xml/dynamic/DynamicModelTests.java @@ -99,9 +99,7 @@ void testSemiSimpleDynamicModel(ServiceRegistryScope registryScope) { final FieldDetails labels = classDetails.findFieldByName( "labels" ); assertThat( labels.getType().determineRawClass().getClassName() ).isEqualTo( Set.class.getName() ); final ElementCollection elementCollection = labels.getDirectAnnotationUsage( ElementCollection.class ); - assertThat( elementCollection.targetClass() ).isEqualTo( void.class ); - final Target targetUsage = labels.getDirectAnnotationUsage( Target.class ); - assertThat( targetUsage.value() ).isEqualTo( "string" ); + assertThat( elementCollection.targetClass() ).isEqualTo( String.class ); final CollectionClassification collectionClassification = labels.getDirectAnnotationUsage( CollectionClassification.class ); assertThat( collectionClassification.value() ).isEqualTo( LimitedCollectionClassification.SET ); diff --git a/hibernate-core/src/test/java/org/hibernate/orm/test/bootstrap/binding/annotations/access/xml/XmlAccessTest.java b/hibernate-core/src/test/java/org/hibernate/orm/test/bootstrap/binding/annotations/access/xml/XmlAccessTest.java index 594184fec83f..71c0876d70c3 100644 --- a/hibernate-core/src/test/java/org/hibernate/orm/test/bootstrap/binding/annotations/access/xml/XmlAccessTest.java +++ b/hibernate-core/src/test/java/org/hibernate/orm/test/bootstrap/binding/annotations/access/xml/XmlAccessTest.java @@ -4,13 +4,6 @@ */ package org.hibernate.orm.test.bootstrap.binding.annotations.access.xml; -import java.io.IOException; -import java.io.InputStream; -import java.util.ArrayList; -import java.util.Collections; -import java.util.List; - -import org.hibernate.cfg.Configuration; import org.hibernate.engine.spi.SessionFactoryImplementor; import org.hibernate.metamodel.mapping.AttributeMapping; import org.hibernate.metamodel.mapping.AttributeMappingsList; @@ -19,7 +12,10 @@ import org.hibernate.property.access.spi.GetterFieldImpl; import org.hibernate.property.access.spi.GetterMethodImpl; -import org.hibernate.testing.util.ServiceRegistryUtil; +import org.hibernate.testing.orm.junit.DomainModel; +import org.hibernate.testing.orm.junit.ServiceRegistry; +import org.hibernate.testing.orm.junit.SessionFactory; +import org.hibernate.testing.orm.junit.SessionFactoryScope; import org.junit.jupiter.api.Test; import jakarta.persistence.AccessType; @@ -31,155 +27,82 @@ * * @author Hardy Ferentschik */ +@SuppressWarnings("JUnitMalformedDeclaration") public class XmlAccessTest { @Test - public void testAccessOnBasicXmlElement() { - Class classUnderTest = Tourist.class; - List> classes = new ArrayList<>(); - classes.add( classUnderTest ); - List configFiles = Collections.emptyList(); - SessionFactoryImplementor factory = buildSessionFactory( classes, configFiles ); - + @ServiceRegistry + @DomainModel(annotatedClasses = Tourist.class) + @SessionFactory + void testBaseline(SessionFactoryScope factoryScope) { // without any xml configuration we have field access - assertAccessType( factory, classUnderTest, AccessType.FIELD ); - factory.close(); - // now with an additional xml configuration file changing the default access type for Tourist using basic - configFiles = new ArrayList<>(); - configFiles.add( "org/hibernate/orm/test/bootstrap/binding.annotations.access.xml/Tourist.xml" ); - factory = buildSessionFactory( classes, configFiles ); - assertAccessType( factory, classUnderTest, AccessType.PROPERTY ); - factory.close(); + assertAccessType( factoryScope.getSessionFactory(), Tourist.class, AccessType.FIELD ); } @Test - public void testAccessOnPersistenceUnitDefaultsXmlElement() { - Class classUnderTest = Tourist.class; - List> classes = new ArrayList<>(); - classes.add( classUnderTest ); - List configFiles = Collections.emptyList(); - SessionFactoryImplementor factory = buildSessionFactory( classes, configFiles ); - - // without any xml configuration we have field access - assertAccessType( factory, classUnderTest, AccessType.FIELD ); - factory.close(); - // now with an additional xml configuration file changing the default access type for Tourist using persitence unit defaults - configFiles = new ArrayList<>(); - configFiles.add( "org/hibernate/orm/test/bootstrap/binding.annotations.access.xml/Tourist2.xml" ); - factory = buildSessionFactory( classes, configFiles ); - assertAccessType( factory, classUnderTest, AccessType.PROPERTY ); - factory.close(); + @ServiceRegistry + @DomainModel(annotatedClasses = Tourist.class, xmlMappings = "org/hibernate/orm/test/bootstrap/binding.annotations.access.xml/Tourist.xml") + @SessionFactory + public void testAccessOnBasicXmlElement(SessionFactoryScope factoryScope) { + assertAccessType( factoryScope.getSessionFactory(), Tourist.class, AccessType.PROPERTY ); } @Test - public void testAccessOnEntityMappingsXmlElement() { - Class classUnderTest = Tourist.class; - List> classes = new ArrayList<>(); - classes.add( classUnderTest ); - List configFiles = Collections.emptyList(); - SessionFactoryImplementor factory = buildSessionFactory( classes, configFiles ); - - // without any xml configuration we have field access - assertAccessType( factory, classUnderTest, AccessType.FIELD ); - factory.close(); - // now with an additional xml configuration file changing the default access type for Tourist using default in entity-mappings - configFiles = new ArrayList<>(); - configFiles.add( "org/hibernate/orm/test/bootstrap/binding.annotations.access.xml/Tourist3.xml" ); - factory = buildSessionFactory( classes, configFiles ); - assertAccessType( factory, classUnderTest, AccessType.PROPERTY ); - factory.close(); + @ServiceRegistry + @DomainModel(annotatedClasses = Tourist.class, xmlMappings = "org/hibernate/orm/test/bootstrap/binding.annotations.access.xml/Tourist2.xml") + @SessionFactory + public void testAccessOnPersistenceUnitDefaultsXmlElement(SessionFactoryScope factoryScope) { + assertAccessType( factoryScope.getSessionFactory(), Tourist.class, AccessType.PROPERTY ); } @Test - public void testAccessOnEntityXmlElement() { - Class classUnderTest = Tourist.class; - List> classes = new ArrayList<>(); - classes.add( classUnderTest ); - List configFiles = Collections.emptyList(); - SessionFactoryImplementor factory = buildSessionFactory( classes, configFiles ); - - // without any xml configuration we have field access - assertAccessType( factory, classUnderTest, AccessType.FIELD ); - factory.close(); - // now with an additional xml configuration file changing the default access type for Tourist using entity level config - configFiles = new ArrayList<>(); - configFiles.add( "org/hibernate/orm/test/bootstrap/binding.annotations.access.xml/Tourist4.xml" ); - factory = buildSessionFactory( classes, configFiles ); - assertAccessType( factory, classUnderTest, AccessType.PROPERTY ); - factory.close(); + @ServiceRegistry + @DomainModel(annotatedClasses = Tourist.class, xmlMappings = "org/hibernate/orm/test/bootstrap/binding.annotations.access.xml/Tourist3.xml") + @SessionFactory + public void testAccessOnEntityMappingsXmlElement(SessionFactoryScope factoryScope) { + assertAccessType( factoryScope.getSessionFactory(), Tourist.class, AccessType.PROPERTY ); } @Test - public void testAccessOnMappedSuperClassXmlElement() { - Class classUnderTest = Waiter.class; - List> classes = new ArrayList<>(); - classes.add( classUnderTest ); - classes.add( Crew.class ); - List configFiles = new ArrayList<>(); - configFiles.add( "org/hibernate/orm/test/bootstrap/binding.annotations.access.xml/Crew.xml" ); - SessionFactoryImplementor factory = buildSessionFactory( classes, configFiles ); - assertAccessType( factory, classUnderTest, AccessType.FIELD ); - factory.close(); + @ServiceRegistry + @DomainModel(annotatedClasses = Tourist.class, xmlMappings = "org/hibernate/orm/test/bootstrap/binding.annotations.access.xml/Tourist4.xml") + @SessionFactory + public void testAccessOnEntityXmlElement(SessionFactoryScope factoryScope) { + assertAccessType( factoryScope.getSessionFactory(), Tourist.class, AccessType.PROPERTY ); } @Test - public void testAccessOnAssociationXmlElement() { - Class classUnderTest = RentalCar.class; - List> classes = new ArrayList<>(); - classes.add( classUnderTest ); - classes.add( Driver.class ); - List configFiles = new ArrayList<>(); - configFiles.add( "org/hibernate/orm/test/bootstrap/binding.annotations.access.xml/RentalCar.xml" ); - SessionFactoryImplementor factory = buildSessionFactory( classes, configFiles ); - assertAccessType( factory, classUnderTest, AccessType.PROPERTY ); - factory.close(); + @ServiceRegistry + @DomainModel(annotatedClasses = Waiter.class, xmlMappings = "org/hibernate/orm/test/bootstrap/binding.annotations.access.xml/Crew.xml") + @SessionFactory + public void testAccessOnMappedSuperClassXmlElement(SessionFactoryScope factoryScope) { + assertAccessType( factoryScope.getSessionFactory(), Waiter.class, AccessType.FIELD ); } @Test - public void testAccessOnEmbeddedXmlElement() { - Class classUnderTest = Cook.class; - List> classes = new ArrayList<>(); - classes.add( classUnderTest ); - classes.add( Knive.class ); - List configFiles = new ArrayList<>(); - configFiles.add( "org/hibernate/orm/test/bootstrap/binding.annotations.access.xml/Cook.xml" ); - SessionFactoryImplementor factory = buildSessionFactory( classes, configFiles ); - assertAccessType( factory, classUnderTest, AccessType.PROPERTY ); - factory.close(); + @ServiceRegistry + @DomainModel(annotatedClasses = {RentalCar.class, Driver.class}, xmlMappings = "org/hibernate/orm/test/bootstrap/binding.annotations.access.xml/RentalCar.xml") + @SessionFactory + public void testAccessOnAssociationXmlElement(SessionFactoryScope factoryScope) { + assertAccessType( factoryScope.getSessionFactory(), RentalCar.class, AccessType.PROPERTY ); } @Test - public void testAccessOnElementCollectionXmlElement() { - Class classUnderTest = Boy.class; - List> classes = new ArrayList<>(); - classes.add( classUnderTest ); - List configFiles = new ArrayList<>(); - configFiles.add( "org/hibernate/orm/test/bootstrap/binding.annotations.access.xml/Boy.xml" ); - SessionFactoryImplementor factory = buildSessionFactory( classes, configFiles ); - assertAccessType( factory, classUnderTest, AccessType.PROPERTY ); - factory.close(); + @ServiceRegistry + @DomainModel(annotatedClasses = {Cook.class, Knive.class}, xmlMappings = "org/hibernate/orm/test/bootstrap/binding.annotations.access.xml/Cook.xml") + @SessionFactory + public void testAccessOnEmbeddedXmlElement(SessionFactoryScope factoryScope) { + assertAccessType( factoryScope.getSessionFactory(), Cook.class, AccessType.PROPERTY ); } - private SessionFactoryImplementor buildSessionFactory(List> classesUnderTest, List configFiles) { - assert classesUnderTest != null; - assert configFiles != null; - Configuration cfg = new Configuration(); - for ( Class clazz : classesUnderTest ) { - cfg.addAnnotatedClass( clazz ); - } - ServiceRegistryUtil.applySettings( cfg.getStandardServiceRegistryBuilder() ); - for ( String configFile : configFiles ) { - try (InputStream is = Thread.currentThread().getContextClassLoader().getResourceAsStream( configFile )) { - cfg.addInputStream( is ); - } - catch (IOException e) { - throw new IllegalArgumentException( e ); - } - } - return (SessionFactoryImplementor) cfg.buildSessionFactory(); + @Test + @ServiceRegistry + @DomainModel(annotatedClasses = Boy.class, xmlMappings = "org/hibernate/orm/test/bootstrap/binding.annotations.access.xml/Boy.xml") + @SessionFactory + public void testAccessOnElementCollectionXmlElement(SessionFactoryScope factoryScope) { + assertAccessType( factoryScope.getSessionFactory(), Boy.class, AccessType.PROPERTY ); } - // uses the first getter of the tupelizer for the assertions private void assertAccessType(SessionFactoryImplementor factory, Class classUnderTest, AccessType accessType) { final EntityPersister entityDescriptor = factory.getRuntimeMetamodels() diff --git a/hibernate-testing/src/main/java/org/hibernate/testing/boot/BootstrapContextImpl.java b/hibernate-testing/src/main/java/org/hibernate/testing/boot/BootstrapContextImpl.java index 74c8cc19348e..79a90680f455 100644 --- a/hibernate-testing/src/main/java/org/hibernate/testing/boot/BootstrapContextImpl.java +++ b/hibernate-testing/src/main/java/org/hibernate/testing/boot/BootstrapContextImpl.java @@ -4,22 +4,19 @@ */ package org.hibernate.testing.boot; -import java.util.Collection; -import java.util.Map; - import org.hibernate.boot.CacheRegionDefinition; import org.hibernate.boot.archive.scan.spi.ScanEnvironment; import org.hibernate.boot.archive.scan.spi.ScanOptions; import org.hibernate.boot.archive.spi.ArchiveDescriptorFactory; -import org.hibernate.boot.registry.classloading.spi.ClassLoaderService; -import org.hibernate.boot.spi.ClassmateContext; import org.hibernate.boot.internal.MetadataBuilderImpl; import org.hibernate.boot.model.convert.spi.ConverterDescriptor; import org.hibernate.boot.model.relational.AuxiliaryDatabaseObject; import org.hibernate.boot.registry.StandardServiceRegistry; import org.hibernate.boot.registry.StandardServiceRegistryBuilder; +import org.hibernate.boot.registry.classloading.spi.ClassLoaderService; import org.hibernate.boot.spi.BootstrapContext; import org.hibernate.boot.spi.ClassLoaderAccess; +import org.hibernate.boot.spi.ClassmateContext; import org.hibernate.boot.spi.MetadataBuildingOptions; import org.hibernate.engine.config.spi.ConfigurationService; import org.hibernate.jpa.spi.MutableJpaCompliance; @@ -33,18 +30,22 @@ import org.hibernate.type.BasicType; import org.hibernate.type.spi.TypeConfiguration; +import java.util.Collection; +import java.util.Map; + /** * @author Andrea Boriero */ public class BootstrapContextImpl implements BootstrapContext, AutoCloseable { - private final BootstrapContext delegate; public BootstrapContextImpl() { - StandardServiceRegistry serviceRegistry = new StandardServiceRegistryBuilder().build(); - MetadataBuildingOptions buildingOptions = new MetadataBuilderImpl.MetadataBuildingOptionsImpl( serviceRegistry ); + this( new StandardServiceRegistryBuilder().build() ); + } + public BootstrapContextImpl(StandardServiceRegistry serviceRegistry) { + final MetadataBuildingOptions buildingOptions = new MetadataBuilderImpl.MetadataBuildingOptionsImpl( serviceRegistry ); delegate = new org.hibernate.boot.internal.BootstrapContextImpl( serviceRegistry, buildingOptions ); }