HHH-17504 - Ongoing JPA 32 work

HHH-17350 - Work on hibernate-models, XSD and JAXB
HHH-16114 - Improve boot metamodel binding
HHH-15996 - Develop an abstraction for Annotation in annotation processing
HHH-16012 - Develop an abstraction for domain model Class refs
HHH-15997 - Support for dynamic models in orm.xml
HHH-15698 - Support for entity-name in mapping.xsd
This commit is contained in:
Steve Ebersole 2024-01-03 09:59:39 -06:00
parent 6869dbb1f9
commit 540b87e78a
104 changed files with 1954 additions and 740 deletions

View File

@ -85,7 +85,7 @@ public class CacheableFileXmlSource extends XmlSource {
else { else {
if ( !isSerfileObsolete() ) { if ( !isSerfileObsolete() ) {
try { try {
return readSerFile(); return new Binding( readSerFile(), getOrigin() );
} }
catch ( SerializationException e ) { catch ( SerializationException e ) {
log.unableToDeserializeCache( serFile.getName(), e ); log.unableToDeserializeCache( serFile.getName(), e );
@ -117,6 +117,9 @@ public class CacheableFileXmlSource extends XmlSource {
} }
private static void writeSerFile(Serializable binding, File xmlFile, File serFile) { private static void writeSerFile(Serializable binding, File xmlFile, File serFile) {
if ( binding instanceof Binding<?> bindingWrapper ) {
binding = (Serializable) bindingWrapper.getRoot();
}
try ( FileOutputStream fos = new FileOutputStream( serFile ) ) { try ( FileOutputStream fos = new FileOutputStream( serFile ) ) {
if ( log.isDebugEnabled() ) { if ( log.isDebugEnabled() ) {
log.debugf( "Writing cache file for: %s to: %s", xmlFile.getAbsolutePath(), serFile.getAbsolutePath() ); log.debugf( "Writing cache file for: %s to: %s", xmlFile.getAbsolutePath(), serFile.getAbsolutePath() );

View File

@ -11,6 +11,7 @@ import java.util.List;
import java.util.Map; import java.util.Map;
import org.hibernate.AnnotationException; import org.hibernate.AnnotationException;
import org.hibernate.Internal;
import org.hibernate.MappingException; import org.hibernate.MappingException;
import org.hibernate.annotations.CollectionTypeRegistration; import org.hibernate.annotations.CollectionTypeRegistration;
import org.hibernate.annotations.CollectionTypeRegistrations; import org.hibernate.annotations.CollectionTypeRegistrations;
@ -388,7 +389,7 @@ public final class AnnotationBinder {
bindQueries( annotatedClass, context ); bindQueries( annotatedClass, context );
handleImport( annotatedClass, context ); handleImport( annotatedClass, context );
bindFilterDefs( annotatedClass, context ); //bindFilterDefs( annotatedClass, context );
bindTypeDescriptorRegistrations( annotatedClass, context ); bindTypeDescriptorRegistrations( annotatedClass, context );
bindEmbeddableInstantiatorRegistrations( annotatedClass, context ); bindEmbeddableInstantiatorRegistrations( annotatedClass, context );
bindUserTypeRegistrations( annotatedClass, context ); bindUserTypeRegistrations( annotatedClass, context );

View File

@ -21,7 +21,9 @@ import java.util.List;
import java.util.Map; import java.util.Map;
import java.util.Set; import java.util.Set;
import java.util.UUID; import java.util.UUID;
import java.util.stream.Collectors;
import org.hibernate.Internal;
import org.hibernate.boot.MetadataSources; import org.hibernate.boot.MetadataSources;
import org.hibernate.boot.internal.InFlightMetadataCollectorImpl; import org.hibernate.boot.internal.InFlightMetadataCollectorImpl;
import org.hibernate.boot.internal.MetadataBuildingContextRootImpl; import org.hibernate.boot.internal.MetadataBuildingContextRootImpl;
@ -30,8 +32,8 @@ import org.hibernate.boot.jaxb.SourceType;
import org.hibernate.boot.jaxb.hbm.spi.JaxbHbmHibernateMapping; import org.hibernate.boot.jaxb.hbm.spi.JaxbHbmHibernateMapping;
import org.hibernate.boot.jaxb.internal.MappingBinder; import org.hibernate.boot.jaxb.internal.MappingBinder;
import org.hibernate.boot.jaxb.mapping.spi.JaxbEntityMappingsImpl; import org.hibernate.boot.jaxb.mapping.spi.JaxbEntityMappingsImpl;
import org.hibernate.boot.jaxb.spi.JaxbBindableMappingDescriptor;
import org.hibernate.boot.jaxb.spi.Binding; import org.hibernate.boot.jaxb.spi.Binding;
import org.hibernate.boot.jaxb.spi.JaxbBindableMappingDescriptor;
import org.hibernate.boot.model.TypeContributions; import org.hibernate.boot.model.TypeContributions;
import org.hibernate.boot.model.TypeContributor; import org.hibernate.boot.model.TypeContributor;
import org.hibernate.boot.model.process.internal.ManagedResourcesImpl; import org.hibernate.boot.model.process.internal.ManagedResourcesImpl;
@ -40,14 +42,24 @@ import org.hibernate.boot.model.relational.AuxiliaryDatabaseObject;
import org.hibernate.boot.model.relational.Namespace; import org.hibernate.boot.model.relational.Namespace;
import org.hibernate.boot.model.relational.Sequence; import org.hibernate.boot.model.relational.Sequence;
import org.hibernate.boot.model.source.internal.annotations.AnnotationMetadataSourceProcessorImpl; import org.hibernate.boot.model.source.internal.annotations.AnnotationMetadataSourceProcessorImpl;
import org.hibernate.boot.model.source.internal.annotations.DomainModelSource;
import org.hibernate.boot.model.source.internal.hbm.EntityHierarchyBuilder; import org.hibernate.boot.model.source.internal.hbm.EntityHierarchyBuilder;
import org.hibernate.boot.model.source.internal.hbm.EntityHierarchySourceImpl; import org.hibernate.boot.model.source.internal.hbm.EntityHierarchySourceImpl;
import org.hibernate.boot.model.source.internal.hbm.HbmMetadataSourceProcessorImpl; import org.hibernate.boot.model.source.internal.hbm.HbmMetadataSourceProcessorImpl;
import org.hibernate.boot.model.source.internal.hbm.MappingDocument; import org.hibernate.boot.model.source.internal.hbm.MappingDocument;
import org.hibernate.boot.model.source.internal.hbm.ModelBinder; import org.hibernate.boot.model.source.internal.hbm.ModelBinder;
import org.hibernate.boot.model.source.spi.MetadataSourceProcessor; import org.hibernate.boot.model.source.spi.MetadataSourceProcessor;
import org.hibernate.boot.models.categorize.internal.ClassLoaderServiceLoading;
import org.hibernate.boot.models.categorize.internal.DomainModelCategorizationCollector;
import org.hibernate.boot.models.categorize.internal.OrmAnnotationHelper;
import org.hibernate.boot.models.categorize.spi.ManagedResourcesProcessor;
import org.hibernate.boot.models.xml.spi.XmlPreProcessingResult;
import org.hibernate.boot.models.xml.spi.XmlPreProcessor;
import org.hibernate.boot.models.xml.spi.XmlProcessingResult;
import org.hibernate.boot.models.xml.spi.XmlProcessor;
import org.hibernate.boot.registry.StandardServiceRegistry; import org.hibernate.boot.registry.StandardServiceRegistry;
import org.hibernate.boot.registry.classloading.spi.ClassLoaderService; import org.hibernate.boot.registry.classloading.spi.ClassLoaderService;
import org.hibernate.boot.registry.classloading.spi.ClassLoadingException;
import org.hibernate.boot.spi.AdditionalJaxbMappingProducer; import org.hibernate.boot.spi.AdditionalJaxbMappingProducer;
import org.hibernate.boot.spi.AdditionalMappingContributions; import org.hibernate.boot.spi.AdditionalMappingContributions;
import org.hibernate.boot.spi.AdditionalMappingContributor; import org.hibernate.boot.spi.AdditionalMappingContributor;
@ -63,6 +75,16 @@ import org.hibernate.engine.config.spi.ConfigurationService;
import org.hibernate.engine.config.spi.StandardConverters; import org.hibernate.engine.config.spi.StandardConverters;
import org.hibernate.engine.jdbc.spi.JdbcServices; import org.hibernate.engine.jdbc.spi.JdbcServices;
import org.hibernate.mapping.Table; import org.hibernate.mapping.Table;
import org.hibernate.models.internal.SourceModelBuildingContextImpl;
import org.hibernate.models.internal.jandex.JandexClassDetails;
import org.hibernate.models.internal.jandex.JandexIndexerHelper;
import org.hibernate.models.internal.jdk.JdkBuilders;
import org.hibernate.models.spi.AnnotationDescriptorRegistry;
import org.hibernate.models.spi.ClassDetails;
import org.hibernate.models.spi.ClassDetailsRegistry;
import org.hibernate.models.spi.ClassLoading;
import org.hibernate.models.spi.RegistryPrimer;
import org.hibernate.models.spi.SourceModelBuildingContext;
import org.hibernate.type.BasicType; import org.hibernate.type.BasicType;
import org.hibernate.type.BasicTypeRegistry; import org.hibernate.type.BasicTypeRegistry;
import org.hibernate.type.SqlTypes; import org.hibernate.type.SqlTypes;
@ -82,11 +104,15 @@ import org.hibernate.type.internal.NamedBasicTypeImpl;
import org.hibernate.type.spi.TypeConfiguration; import org.hibernate.type.spi.TypeConfiguration;
import org.hibernate.usertype.CompositeUserType; import org.hibernate.usertype.CompositeUserType;
import org.jboss.jandex.ClassInfo;
import org.jboss.jandex.CompositeIndex;
import org.jboss.jandex.IndexView; import org.jboss.jandex.IndexView;
import org.jboss.jandex.Indexer;
import org.jboss.logging.Logger; import org.jboss.logging.Logger;
import jakarta.persistence.AttributeConverter; import jakarta.persistence.AttributeConverter;
import static org.hibernate.internal.util.collections.CollectionHelper.mutableJoin;
import static org.hibernate.internal.util.config.ConfigurationHelper.getPreferredSqlTypeCodeForArray; import static org.hibernate.internal.util.config.ConfigurationHelper.getPreferredSqlTypeCodeForArray;
import static org.hibernate.internal.util.config.ConfigurationHelper.getPreferredSqlTypeCodeForDuration; import static org.hibernate.internal.util.config.ConfigurationHelper.getPreferredSqlTypeCodeForDuration;
import static org.hibernate.internal.util.config.ConfigurationHelper.getPreferredSqlTypeCodeForInstant; import static org.hibernate.internal.util.config.ConfigurationHelper.getPreferredSqlTypeCodeForInstant;
@ -175,8 +201,7 @@ public class MetadataBuildingProcess {
handleTypes( bootstrapContext, options, metadataCollector ); handleTypes( bootstrapContext, options, metadataCollector );
final ClassLoaderService classLoaderService = final DomainModelSource domainModelSource = processManagedResources( managedResources, bootstrapContext );
options.getServiceRegistry().requireService( ClassLoaderService.class );
final MetadataBuildingContextRootImpl rootMetadataBuildingContext = new MetadataBuildingContextRootImpl( final MetadataBuildingContextRootImpl rootMetadataBuildingContext = new MetadataBuildingContextRootImpl(
"orm", "orm",
@ -189,13 +214,12 @@ public class MetadataBuildingProcess {
bootstrapContext.getTypeConfiguration().scope( rootMetadataBuildingContext ); bootstrapContext.getTypeConfiguration().scope( rootMetadataBuildingContext );
final IndexView jandexView = bootstrapContext.getJandexView();
// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
// Set up the processors and start binding // Set up the processors and start binding
// NOTE : this becomes even more simplified after we move purely // NOTE : this becomes even more simplified after we move purely
// to unified model // to unified model
final ClassLoaderService classLoaderService = options.getServiceRegistry().getService( ClassLoaderService.class );
final IndexView jandexView = domainModelSource.getJandexIndex();
final MetadataSourceProcessor processor = new MetadataSourceProcessor() { final MetadataSourceProcessor processor = new MetadataSourceProcessor() {
private final MetadataSourceProcessor hbmProcessor = private final MetadataSourceProcessor hbmProcessor =
@ -205,13 +229,15 @@ public class MetadataBuildingProcess {
private final AnnotationMetadataSourceProcessorImpl annotationProcessor = new AnnotationMetadataSourceProcessorImpl( private final AnnotationMetadataSourceProcessorImpl annotationProcessor = new AnnotationMetadataSourceProcessorImpl(
managedResources, managedResources,
rootMetadataBuildingContext, domainModelSource,
jandexView rootMetadataBuildingContext
); );
@Override @Override
public void prepare() { public void prepare() {
hbmProcessor.prepare(); hbmProcessor.prepare();
annotationProcessor.prepare(); annotationProcessor.prepare();
} }
@ -346,6 +372,195 @@ public class MetadataBuildingProcess {
return metadataCollector.buildMetadataInstance( rootMetadataBuildingContext ); return metadataCollector.buildMetadataInstance( rootMetadataBuildingContext );
} }
@Internal
public static DomainModelSource processManagedResources(
ManagedResources managedResources,
BootstrapContext bootstrapContext) {
final ClassLoaderService classLoaderService = bootstrapContext.getServiceRegistry().getService( ClassLoaderService.class );
final ClassLoaderServiceLoading classLoading = new ClassLoaderServiceLoading( classLoaderService );
// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
// - pre-process the XML
// - collect all known classes
// - resolve (possibly building) Jandex index
// - build the SourceModelBuildingContext
//
// INPUTS:
// - serviceRegistry
// - managedResources
// - bootstrapContext (supplied Jandex index, if one)
//
// OUTPUTS:
// - xmlPreProcessingResult
// - allKnownClassNames (technically could be included in xmlPreProcessingResult)
// - sourceModelBuildingContext
final XmlPreProcessingResult xmlPreProcessingResult = XmlPreProcessor.preProcessXmlResources( managedResources );
//noinspection unchecked
final List<String> allKnownClassNames = mutableJoin(
managedResources.getAnnotatedClassReferences().stream().map( Class::getName ).collect( Collectors.toList() ),
managedResources.getAnnotatedClassNames(),
xmlPreProcessingResult.getMappedClasses()
);
managedResources.getAnnotatedPackageNames().forEach( (packageName) -> {
try {
final Class<?> packageInfoClass = classLoading.classForName( packageName + ".package-info" );
allKnownClassNames.add( packageInfoClass.getName() );
}
catch (ClassLoadingException classLoadingException) {
// no package-info, so there can be no annotations... just skip it
}
} );
managedResources.getAnnotatedClassReferences().forEach( (clazz) -> allKnownClassNames.add( clazz.getName() ) );
// At this point we know all managed class names across all sources.
// Resolve the Jandex Index and build the SourceModelBuildingContext.
final IndexView jandexIndex = resolveJandexIndex( allKnownClassNames, bootstrapContext.getJandexView(), classLoading );
final SourceModelBuildingContextImpl sourceModelBuildingContext = new SourceModelBuildingContextImpl(
classLoading,
jandexIndex,
ManagedResourcesProcessor::preFillRegistries
);
// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
// - process metadata-complete XML
// - collect overlay XML
// - process annotations (including those from metadata-complete XML)
// - apply overlay XML
//
// INPUTS:
// - "options" (areIdGeneratorsGlobal, etc)
// - xmlPreProcessingResult
// - sourceModelBuildingContext
//
// OUTPUTS
// - rootEntities
// - mappedSuperClasses
// - embeddables
// JPA id generator global-ity thing
final boolean areIdGeneratorsGlobal = true;
final ClassDetailsRegistry classDetailsRegistry = sourceModelBuildingContext.getClassDetailsRegistry();
final AnnotationDescriptorRegistry descriptorRegistry = sourceModelBuildingContext.getAnnotationDescriptorRegistry();
final DomainModelCategorizationCollector modelCategorizationCollector = new DomainModelCategorizationCollector(
areIdGeneratorsGlobal,
classDetailsRegistry,
descriptorRegistry,
jandexIndex
);
final XmlProcessingResult xmlProcessingResult = XmlProcessor.processXml( xmlPreProcessingResult, modelCategorizationCollector, sourceModelBuildingContext );
final HashSet<String> categorizedClassNames = new HashSet<>();
allKnownClassNames.forEach( (className) -> applyKnownClass(
className,
categorizedClassNames,
classDetailsRegistry,
modelCategorizationCollector
) );
xmlPreProcessingResult.getMappedNames().forEach( (className) -> applyKnownClass(
className,
categorizedClassNames,
classDetailsRegistry,
modelCategorizationCollector
) );
xmlProcessingResult.apply( xmlPreProcessingResult.getPersistenceUnitMetadata() );
return new DomainModelSource(
classDetailsRegistry.makeImmutableCopy(),
jandexIndex,
modelCategorizationCollector.getGlobalRegistrations(),
xmlPreProcessingResult.getPersistenceUnitMetadata()
);
}
private static void applyKnownClass(
String className,
HashSet<String> categorizedClassNames,
ClassDetailsRegistry classDetailsRegistry,
DomainModelCategorizationCollector modelCategorizationCollector) {
if ( categorizedClassNames.add( className ) ) {
final ClassDetails classDetails = classDetailsRegistry.resolveClassDetails( className );
applyKnownClass( classDetails, categorizedClassNames,classDetailsRegistry, modelCategorizationCollector );
}
}
private static void applyKnownClass(
ClassDetails classDetails,
HashSet<String> categorizedClassNames,
ClassDetailsRegistry classDetailsRegistry,
DomainModelCategorizationCollector modelCategorizationCollector) {
modelCategorizationCollector.apply( classDetails );
if ( classDetails.getSuperType() != null ) {
if ( categorizedClassNames.add( classDetails.getSuperType().getClassName() ) ) {
applyKnownClass( classDetails.getSuperType(), categorizedClassNames, classDetailsRegistry, modelCategorizationCollector );
}
}
}
public static IndexView resolveJandexIndex(
List<String> allKnownClassNames,
IndexView suppliedJandexIndex,
ClassLoading classLoading) {
// todo : we could build a new Jandex (Composite)Index that includes the `managedResources#getAnnotatedClassNames`
// and all classes from `managedResources#getXmlMappingBindings`. Only really worth it in the case
// of runtime enhancement. This would definitely need to be toggle-able.
// +
// For now, let's not as it does not matter for this PoC
if ( 1 == 1 ) {
return suppliedJandexIndex;
}
final Indexer jandexIndexer = new Indexer();
for ( String knownClassName : allKnownClassNames ) {
JandexIndexerHelper.apply( knownClassName, jandexIndexer, classLoading );
}
if ( suppliedJandexIndex == null ) {
return jandexIndexer.complete();
}
return CompositeIndex.create( suppliedJandexIndex, jandexIndexer.complete() );
}
public static void preFillRegistries(RegistryPrimer.Contributions contributions, SourceModelBuildingContext buildingContext) {
OrmAnnotationHelper.forEachOrmAnnotation( contributions::registerAnnotation );
final IndexView jandexIndex = buildingContext.getJandexIndex();
if ( jandexIndex == null ) {
return;
}
final ClassDetailsRegistry classDetailsRegistry = buildingContext.getClassDetailsRegistry();
final AnnotationDescriptorRegistry annotationDescriptorRegistry = buildingContext.getAnnotationDescriptorRegistry();
for ( ClassInfo knownClass : jandexIndex.getKnownClasses() ) {
final String className = knownClass.name().toString();
if ( knownClass.isAnnotation() ) {
// it is always safe to load the annotation classes - we will never be enhancing them
//noinspection rawtypes
final Class annotationClass = buildingContext
.getClassLoading()
.classForName( className );
//noinspection unchecked
annotationDescriptorRegistry.resolveDescriptor(
annotationClass,
(t) -> JdkBuilders.buildAnnotationDescriptor( annotationClass, buildingContext.getAnnotationDescriptorRegistry() )
);
}
classDetailsRegistry.resolveClassDetails(
className,
(name) -> new JandexClassDetails( knownClass, buildingContext )
);
}
}
private static void processAdditionalMappingContributions( private static void processAdditionalMappingContributions(
InFlightMetadataCollectorImpl metadataCollector, InFlightMetadataCollectorImpl metadataCollector,
MetadataBuildingOptions options, MetadataBuildingOptions options,

View File

@ -4,7 +4,7 @@
* License: GNU Lesser General Public License (LGPL), version 2.1 or later. * License: GNU Lesser General Public License (LGPL), version 2.1 or later.
* See the lgpl.txt file in the root directory or http://www.gnu.org/licenses/lgpl-2.1.html. * See the lgpl.txt file in the root directory or http://www.gnu.org/licenses/lgpl-2.1.html.
*/ */
package org.hibernate.orm.test.boot.models; package org.hibernate.boot.model.source.internal.annotations;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Collection; import java.util.Collection;
@ -23,12 +23,12 @@ import org.hibernate.boot.model.process.spi.ManagedResources;
/** /**
* @author Steve Ebersole * @author Steve Ebersole
*/ */
public class ManagedResourcesImpl implements ManagedResources { public class AdditionalManagedResourcesImpl implements ManagedResources {
private final Collection<Class<?>> knownClasses; private final Collection<Class<?>> knownClasses;
private final Collection<String> packageNames; private final Collection<String> packageNames;
private final Collection<Binding<JaxbBindableMappingDescriptor>> xmlMappings; private final Collection<Binding<JaxbBindableMappingDescriptor>> xmlMappings;
public ManagedResourcesImpl( public AdditionalManagedResourcesImpl(
Collection<Class<?>> knownClasses, Collection<Class<?>> knownClasses,
Collection<String> packageNames, Collection<String> packageNames,
Collection<Binding<JaxbBindableMappingDescriptor>> xmlMappings) { Collection<Binding<JaxbBindableMappingDescriptor>> xmlMappings) {
@ -80,27 +80,39 @@ public class ManagedResourcesImpl implements ManagedResources {
private Collection<Binding<JaxbBindableMappingDescriptor>> xmlMappings; private Collection<Binding<JaxbBindableMappingDescriptor>> xmlMappings;
public Builder() { public Builder() {
this( new MappingBinder.Options() {
@Override
public boolean validateMappings() {
return false;
}
@Override
public boolean transformHbmMappings() {
return false;
}
} );
}
public Builder(MappingBinder.Options options) {
mappingBinder = new MappingBinder( mappingBinder = new MappingBinder(
(resourceName) -> Builder.class.getClassLoader().getResourceAsStream( resourceName ), (resourceName) -> Builder.class.getClassLoader().getResourceAsStream( resourceName ),
new MappingBinder.Options() { options
@Override
public boolean validateMappings() {
return true;
}
@Override
public boolean transformHbmMappings() {
return false;
}
}
); );
} }
public Builder addLoadedClasses(Class<?>... classes) { public Builder addLoadedClasses(List<Class<?>> additionalClasses) {
if ( this.classes == null ) { if ( this.classes == null ) {
this.classes = new ArrayList<>(); this.classes = new ArrayList<>();
} }
Collections.addAll( this.classes, classes ); this.classes.addAll( additionalClasses );
return this;
}
public Builder addLoadedClasses(Class<?>... additionalClasses) {
if ( this.classes == null ) {
this.classes = new ArrayList<>();
}
Collections.addAll( this.classes, additionalClasses );
return this; return this;
} }
@ -113,14 +125,21 @@ public class ManagedResourcesImpl implements ManagedResources {
} }
public ManagedResources build() { public ManagedResources build() {
return new ManagedResourcesImpl( classes, packageNames, xmlMappings ); return new AdditionalManagedResourcesImpl( classes, packageNames, xmlMappings );
} }
public Builder addXmlMappings(String resourceName) { public Builder addXmlMappings(String resourceName) {
final Binding<JaxbBindableMappingDescriptor> binding = mappingBinder.bind( return addXmlMappings( resourceName, new Origin( SourceType.RESOURCE, resourceName ) );
}
public Builder addXmlMappings(String resourceName, Origin origin) {
return addXmlBinding( mappingBinder.bind(
Builder.class.getClassLoader().getResourceAsStream( resourceName ), Builder.class.getClassLoader().getResourceAsStream( resourceName ),
new Origin( SourceType.RESOURCE, resourceName ) origin
); ) );
}
public Builder addXmlBinding(Binding<JaxbBindableMappingDescriptor> binding) {
if ( xmlMappings == null ) { if ( xmlMappings == null ) {
xmlMappings = new ArrayList<>(); xmlMappings = new ArrayList<>();
} }

View File

@ -7,6 +7,7 @@
package org.hibernate.boot.model.source.internal.annotations; package org.hibernate.boot.model.source.internal.annotations;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.HashMap;
import java.util.LinkedHashSet; import java.util.LinkedHashSet;
import java.util.List; import java.util.List;
import java.util.Map; import java.util.Map;
@ -16,69 +17,106 @@ import org.hibernate.annotations.common.reflection.MetadataProviderInjector;
import org.hibernate.annotations.common.reflection.ReflectionManager; import org.hibernate.annotations.common.reflection.ReflectionManager;
import org.hibernate.annotations.common.reflection.XClass; import org.hibernate.annotations.common.reflection.XClass;
import org.hibernate.boot.internal.MetadataBuildingContextRootImpl; import org.hibernate.boot.internal.MetadataBuildingContextRootImpl;
import org.hibernate.boot.jaxb.Origin;
import org.hibernate.boot.jaxb.mapping.spi.JaxbEntityMappingsImpl; import org.hibernate.boot.jaxb.mapping.spi.JaxbEntityMappingsImpl;
import org.hibernate.boot.jaxb.spi.Binding; import org.hibernate.boot.jaxb.spi.Binding;
import org.hibernate.boot.model.convert.internal.ClassBasedConverterDescriptor;
import org.hibernate.boot.model.convert.spi.ConverterRegistry; import org.hibernate.boot.model.convert.spi.ConverterRegistry;
import org.hibernate.boot.model.convert.spi.RegisteredConversion;
import org.hibernate.boot.model.internal.AnnotationBinder; import org.hibernate.boot.model.internal.AnnotationBinder;
import org.hibernate.boot.model.internal.InheritanceState; import org.hibernate.boot.model.internal.InheritanceState;
import org.hibernate.boot.model.internal.JPAXMLOverriddenMetadataProvider; import org.hibernate.boot.model.internal.JPAXMLOverriddenMetadataProvider;
import org.hibernate.boot.model.process.spi.ManagedResources; import org.hibernate.boot.model.process.spi.ManagedResources;
import org.hibernate.boot.model.process.spi.MetadataBuildingProcess;
import org.hibernate.boot.model.source.spi.MetadataSourceProcessor; import org.hibernate.boot.model.source.spi.MetadataSourceProcessor;
import org.hibernate.boot.models.categorize.spi.FilterDefRegistration;
import org.hibernate.boot.models.xml.spi.PersistenceUnitMetadata;
import org.hibernate.boot.registry.classloading.spi.ClassLoaderService; import org.hibernate.boot.registry.classloading.spi.ClassLoaderService;
import org.hibernate.boot.spi.JpaOrmXmlPersistenceUnitDefaultAware; import org.hibernate.boot.spi.JpaOrmXmlPersistenceUnitDefaultAware;
import org.hibernate.boot.spi.JpaOrmXmlPersistenceUnitDefaultAware.JpaOrmXmlPersistenceUnitDefaults; import org.hibernate.boot.spi.JpaOrmXmlPersistenceUnitDefaultAware.JpaOrmXmlPersistenceUnitDefaults;
import org.hibernate.boot.spi.MetadataBuildingContext;
import org.hibernate.boot.spi.MetadataBuildingOptions; import org.hibernate.boot.spi.MetadataBuildingOptions;
import org.hibernate.engine.spi.FilterDefinition;
import org.hibernate.internal.util.StringHelper; import org.hibernate.internal.util.StringHelper;
import org.hibernate.internal.util.collections.CollectionHelper; import org.hibernate.internal.util.collections.CollectionHelper;
import org.jboss.jandex.IndexView; import org.hibernate.metamodel.mapping.JdbcMapping;
import org.hibernate.models.spi.ClassDetails;
import org.hibernate.type.descriptor.java.JavaType;
import org.hibernate.usertype.UserType;
import org.jboss.logging.Logger; import org.jboss.logging.Logger;
import jakarta.persistence.AttributeConverter; import jakarta.persistence.AttributeConverter;
import jakarta.persistence.Converter;
import jakarta.persistence.Entity; import jakarta.persistence.Entity;
import jakarta.persistence.MappedSuperclass; import jakarta.persistence.MappedSuperclass;
import static org.hibernate.boot.jaxb.SourceType.OTHER;
import static org.hibernate.boot.model.internal.AnnotationBinder.resolveAttributeConverter;
import static org.hibernate.boot.model.internal.AnnotationBinder.resolveBasicType;
import static org.hibernate.boot.model.internal.AnnotationBinder.resolveFilterParamType;
import static org.hibernate.boot.model.internal.AnnotationBinder.resolveJavaType;
import static org.hibernate.boot.model.internal.AnnotationBinder.resolveUserType;
import static org.hibernate.models.internal.jdk.VoidClassDetails.VOID_CLASS_DETAILS;
import static org.hibernate.models.internal.jdk.VoidClassDetails.VOID_OBJECT_CLASS_DETAILS;
/** /**
* @author Steve Ebersole * @author Steve Ebersole
*/ */
public class AnnotationMetadataSourceProcessorImpl implements MetadataSourceProcessor { public class AnnotationMetadataSourceProcessorImpl implements MetadataSourceProcessor {
private static final Logger log = Logger.getLogger( AnnotationMetadataSourceProcessorImpl.class ); private static final Logger log = Logger.getLogger( AnnotationMetadataSourceProcessorImpl.class );
private final MetadataBuildingContextRootImpl rootMetadataBuildingContext; // NOTE : we de-categorize the classes into a single collection (xClasses) here to work with the
// existing "binder" infrastructure.
// todo : once we move to the phased binding approach, come back and handle that
@SuppressWarnings({ "FieldCanBeLocal", "unused" }) private final DomainModelSource domainModelSource;
private final IndexView jandexView;
private final MetadataBuildingContextRootImpl rootMetadataBuildingContext;
private final ClassLoaderService classLoaderService;
private final ReflectionManager reflectionManager; private final ReflectionManager reflectionManager;
private final LinkedHashSet<String> annotatedPackages = new LinkedHashSet<>(); private final LinkedHashSet<String> annotatedPackages = new LinkedHashSet<>();
private final List<XClass> xClasses = new ArrayList<>(); private final List<XClass> xClasses = new ArrayList<>();
private final ClassLoaderService classLoaderService;
/** /**
* Normal constructor used while processing {@linkplain org.hibernate.boot.MetadataSources mapping sources} * Normal constructor used while processing {@linkplain org.hibernate.boot.MetadataSources mapping sources}
*/ */
public AnnotationMetadataSourceProcessorImpl( public AnnotationMetadataSourceProcessorImpl(
ManagedResources managedResources, ManagedResources managedResources,
final MetadataBuildingContextRootImpl rootMetadataBuildingContext, DomainModelSource domainModelSource,
IndexView jandexView) { MetadataBuildingContextRootImpl rootMetadataBuildingContext) {
this.domainModelSource = domainModelSource;
this.rootMetadataBuildingContext = rootMetadataBuildingContext; this.rootMetadataBuildingContext = rootMetadataBuildingContext;
this.jandexView = jandexView;
this.reflectionManager = rootMetadataBuildingContext.getBootstrapContext().getReflectionManager(); this.reflectionManager = rootMetadataBuildingContext.getBootstrapContext().getReflectionManager();
if ( CollectionHelper.isNotEmpty( managedResources.getAnnotatedPackageNames() ) ) { final MetadataBuildingOptions metadataBuildingOptions = rootMetadataBuildingContext.getBuildingOptions();
annotatedPackages.addAll( managedResources.getAnnotatedPackageNames() ); this.classLoaderService = metadataBuildingOptions.getServiceRegistry().getService( ClassLoaderService.class );
}
final ConverterRegistry converterRegistry = rootMetadataBuildingContext.getMetadataCollector().getConverterRegistry();
domainModelSource.getConversionRegistrations().forEach( (registration) -> {
final Class<?> domainType;
if ( registration.getExplicitDomainType() == VOID_CLASS_DETAILS || registration.getExplicitDomainType() == VOID_OBJECT_CLASS_DETAILS ) {
domainType = void.class;
}
else {
domainType = classLoaderService.classForName( registration.getExplicitDomainType().getClassName() );
}
converterRegistry.addRegisteredConversion( new RegisteredConversion(
domainType,
classLoaderService.classForName( registration.getConverterType().getClassName() ),
registration.isAutoApply(),
rootMetadataBuildingContext
) );
} );
domainModelSource.getConverterRegistrations().forEach( (registration) -> {
converterRegistry.addAttributeConverter( new ClassBasedConverterDescriptor(
classLoaderService.classForName( registration.converterClass().getClassName() ),
registration.autoApply(),
rootMetadataBuildingContext.getBootstrapContext().getClassmateContext()
) );
} );
final ConverterRegistry converterRegistry =
rootMetadataBuildingContext.getMetadataCollector().getConverterRegistry();
this.classLoaderService =
rootMetadataBuildingContext.getBuildingOptions().getServiceRegistry()
.requireService( ClassLoaderService.class );
MetadataBuildingOptions metadataBuildingOptions = rootMetadataBuildingContext.getBuildingOptions();
if ( metadataBuildingOptions.isXmlMappingEnabled() ) { if ( metadataBuildingOptions.isXmlMappingEnabled() ) {
// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
// Ewww. This is temporary until we migrate to Jandex + StAX for annotation binding // Ewww. This is temporary until we migrate to Jandex + StAX for annotation binding
@ -90,111 +128,77 @@ public class AnnotationMetadataSourceProcessorImpl implements MetadataSourceProc
continue; continue;
} }
final JaxbEntityMappingsImpl entityMappings = (JaxbEntityMappingsImpl) xmlBinding.getRoot(); final JaxbEntityMappingsImpl entityMappings = (JaxbEntityMappingsImpl) xmlBinding.getRoot();
final List<String> classNames = jpaMetadataProvider.getXMLContext().addDocument( entityMappings ); final List<String> classNames = jpaMetadataProvider.getXMLContext().addDocument( entityMappings );
for ( String className : classNames ) { for ( String className : classNames ) {
xClasses.add( toXClass( className, reflectionManager, classLoaderService ) ); xClasses.add( toXClass( className ) );
} }
} }
jpaMetadataProvider.getXMLContext().applyDiscoveredAttributeConverters( converterRegistry );
// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
} }
for ( String className : managedResources.getAnnotatedClassNames() ) { for ( String className : managedResources.getAnnotatedClassNames() ) {
final Class<?> annotatedClass = classLoaderService.classForName( className ); final Class<?> annotatedClass = classLoaderService.classForName( className );
categorizeAnnotatedClass( annotatedClass, converterRegistry ); xClasses.add( toXClass( annotatedClass ) );
} }
for ( Class<?> annotatedClass : managedResources.getAnnotatedClassReferences() ) { for ( Class<?> annotatedClass : managedResources.getAnnotatedClassReferences() ) {
categorizeAnnotatedClass( annotatedClass, converterRegistry ); xClasses.add( toXClass( annotatedClass ) );
} }
annotatedPackages.addAll( managedResources.getAnnotatedPackageNames() );
}
private XClass toXClass(String className) {
return reflectionManager.toXClass( classLoaderService.classForName( className ) );
}
private XClass toXClass(Class<?> classRef) {
return reflectionManager.toXClass( classRef );
} }
/** /**
* Used as part of processing * Used as part of processing
* {@linkplain org.hibernate.boot.spi.AdditionalMappingContributions#contributeEntity(Class)} "additional" mappings} * {@linkplain org.hibernate.boot.spi.AdditionalMappingContributions#contributeEntity(Class) "additional" mappings}
*/ */
public static void processAdditionalMappings( public static void processAdditionalMappings(
List<Class<?>> additionalClasses, List<Class<?>> additionalClasses,
List<JaxbEntityMappingsImpl> additionalJaxbMappings, List<JaxbEntityMappingsImpl> additionalJaxbMappings,
MetadataBuildingContextRootImpl rootMetadataBuildingContext) { MetadataBuildingContextRootImpl rootMetadataBuildingContext) {
final AnnotationMetadataSourceProcessorImpl processor = new AnnotationMetadataSourceProcessorImpl( rootMetadataBuildingContext ); final AdditionalManagedResourcesImpl.Builder mrBuilder = new AdditionalManagedResourcesImpl.Builder();
mrBuilder.addLoadedClasses( additionalClasses );
if ( additionalJaxbMappings != null && rootMetadataBuildingContext.getBuildingOptions().isXmlMappingEnabled() ) { for ( JaxbEntityMappingsImpl additionalJaxbMapping : additionalJaxbMappings ) {
final ConverterRegistry converterRegistry = rootMetadataBuildingContext.getMetadataCollector().getConverterRegistry(); mrBuilder.addXmlBinding( new Binding<>( additionalJaxbMapping, new Origin( OTHER, "additional" ) ) );
final MetadataProviderInjector injector = (MetadataProviderInjector) processor.reflectionManager;
final JPAXMLOverriddenMetadataProvider metadataProvider = (JPAXMLOverriddenMetadataProvider) injector.getMetadataProvider();
for ( int i = 0; i < additionalJaxbMappings.size(); i++ ) {
final List<String> classNames = metadataProvider.getXMLContext().addDocument( additionalJaxbMappings.get( i ) );
for ( String className : classNames ) {
final XClass xClass = processor.toXClass( className, processor.reflectionManager, processor.classLoaderService );
processor.xClasses.add( xClass );
}
}
metadataProvider.getXMLContext().applyDiscoveredAttributeConverters( converterRegistry );
}
for ( int i = 0; i < additionalClasses.size(); i++ ) {
final XClass xClass = processor.reflectionManager.toXClass( additionalClasses.get( i ) );
if ( !xClass.isAnnotationPresent( Entity.class ) ) {
log.debugf( "@Entity not found on additional entity class - `%s`" );
continue;
}
processor.xClasses.add( xClass );
} }
final ManagedResources mr = mrBuilder.build();
final DomainModelSource additionalDomainModelSource = MetadataBuildingProcess.processManagedResources(
mr,
rootMetadataBuildingContext.getBootstrapContext()
);
final AnnotationMetadataSourceProcessorImpl processor = new AnnotationMetadataSourceProcessorImpl( mr, additionalDomainModelSource, rootMetadataBuildingContext );
processor.processEntityHierarchies( new LinkedHashSet<>() ); processor.processEntityHierarchies( new LinkedHashSet<>() );
} }
/**
* Form used from {@link #processAdditionalMappings}
*/
private AnnotationMetadataSourceProcessorImpl(MetadataBuildingContextRootImpl rootMetadataBuildingContext) {
this.rootMetadataBuildingContext = rootMetadataBuildingContext;
this.jandexView = null;
this.reflectionManager = rootMetadataBuildingContext.getBootstrapContext().getReflectionManager();
this.classLoaderService = rootMetadataBuildingContext.getBuildingOptions().getServiceRegistry().getService( ClassLoaderService.class );
}
private void categorizeAnnotatedClass(Class<?> annotatedClass, ConverterRegistry converterRegistry) {
final XClass xClass = reflectionManager.toXClass( annotatedClass );
// categorize it, based on assumption it does not fall into multiple categories
if ( xClass.isAnnotationPresent( Converter.class ) ) {
//noinspection unchecked
converterRegistry.addAttributeConverter( (Class<? extends AttributeConverter<?,?>>) annotatedClass );
}
else {
xClasses.add( xClass );
}
}
private XClass toXClass(String className, ReflectionManager reflectionManager, ClassLoaderService cls) {
return reflectionManager.toXClass( cls.classForName( className ) );
}
@Override @Override
public void prepare() { public void prepare() {
// use any persistence-unit-defaults defined in orm.xml // use any persistence-unit-defaults defined in orm.xml
// todo : invert this to use the PersistenceUnitMetadata directly (defaulting to the settings)
( (JpaOrmXmlPersistenceUnitDefaultAware) rootMetadataBuildingContext.getBuildingOptions() ).apply( ( (JpaOrmXmlPersistenceUnitDefaultAware) rootMetadataBuildingContext.getBuildingOptions() ).apply(
new JpaOrmXmlPersistenceUnitDefaults() { new JpaOrmXmlPersistenceUnitDefaults() {
final Map<?,?> persistenceUnitDefaults = reflectionManager.getDefaults(); final PersistenceUnitMetadata persistenceUnitMetadata = domainModelSource.getPersistenceUnitMetadata();
@Override @Override
public String getDefaultSchemaName() { public String getDefaultSchemaName() {
return StringHelper.nullIfEmpty( (String) persistenceUnitDefaults.get( "schema" ) ); return StringHelper.nullIfEmpty( persistenceUnitMetadata.getDefaultSchema() );
} }
@Override @Override
public String getDefaultCatalogName() { public String getDefaultCatalogName() {
return StringHelper.nullIfEmpty( (String) persistenceUnitDefaults.get( "catalog" ) ); return StringHelper.nullIfEmpty( persistenceUnitMetadata.getDefaultCatalog() );
} }
@Override @Override
public boolean shouldImplicitlyQuoteIdentifiers() { public boolean shouldImplicitlyQuoteIdentifiers() {
final Object isDelimited = persistenceUnitDefaults.get( "delimited-identifier" ); return persistenceUnitMetadata.useQuotedIdentifiers();
return isDelimited == Boolean.TRUE;
} }
} }
); );
@ -232,6 +236,50 @@ public class AnnotationMetadataSourceProcessorImpl implements MetadataSourceProc
@Override @Override
public void processFilterDefinitions() { public void processFilterDefinitions() {
final Map<String, FilterDefRegistration> filterDefRegistrations = domainModelSource.getGlobalRegistrations().getFilterDefRegistrations();
for ( Map.Entry<String, FilterDefRegistration> filterDefRegistrationEntry : filterDefRegistrations.entrySet() ) {
final Map<String, JdbcMapping> parameterJdbcMappings = new HashMap<>();
final Map<String, ClassDetails> parameterDefinitions = filterDefRegistrationEntry.getValue().getParameters();
if ( CollectionHelper.isNotEmpty( parameterDefinitions ) ) {
for ( Map.Entry<String, ClassDetails> parameterEntry : parameterDefinitions.entrySet() ) {
final String parameterClassName = parameterEntry.getValue().getClassName();
final ClassDetails parameterClassDetails = domainModelSource.getClassDetailsRegistry().resolveClassDetails( parameterClassName );
parameterJdbcMappings.put(
parameterEntry.getKey(),
resolveFilterParamType( parameterClassDetails, rootMetadataBuildingContext )
);
}
}
rootMetadataBuildingContext.getMetadataCollector().addFilterDefinition( new FilterDefinition(
filterDefRegistrationEntry.getValue().getName(),
filterDefRegistrationEntry.getValue().getDefaultCondition(),
parameterJdbcMappings
) );
}
}
private static JdbcMapping resolveFilterParamType(
ClassDetails classDetails,
MetadataBuildingContext context) {
if ( classDetails.isImplementor( UserType.class ) ) {
final Class<UserType<?>> impl = classDetails.toJavaClass();
return resolveUserType( impl, context );
}
if ( classDetails.isImplementor( AttributeConverter.class ) ) {
final Class<AttributeConverter<?,?>> impl = classDetails.toJavaClass();
return resolveAttributeConverter( impl, context );
}
if ( classDetails.isImplementor( JavaType.class ) ) {
final Class<JavaType<?>> impl = classDetails.toJavaClass();
return resolveJavaType( impl, context );
}
return resolveBasicType( classDetails.toJavaClass(), context );
} }
@Override @Override

View File

@ -0,0 +1,64 @@
/*
* Hibernate, Relational Persistence for Idiomatic Java
*
* License: GNU Lesser General Public License (LGPL), version 2.1 or later.
* See the lgpl.txt file in the root directory or http://www.gnu.org/licenses/lgpl-2.1.html.
*/
package org.hibernate.boot.model.source.internal.annotations;
import java.util.Collections;
import java.util.List;
import java.util.Set;
import org.hibernate.boot.models.categorize.spi.ConversionRegistration;
import org.hibernate.boot.models.categorize.spi.ConverterRegistration;
import org.hibernate.boot.models.categorize.spi.GlobalRegistrations;
import org.hibernate.boot.models.xml.spi.PersistenceUnitMetadata;
import org.hibernate.models.spi.ClassDetailsRegistry;
import org.jboss.jandex.IndexView;
/**
* @author Steve Ebersole
*/
public class DomainModelSource {
private final ClassDetailsRegistry classDetailsRegistry;
private final IndexView jandexIndex;
private final GlobalRegistrations globalRegistrations;
private final PersistenceUnitMetadata persistenceUnitMetadata;
public DomainModelSource(
ClassDetailsRegistry classDetailsRegistry,
IndexView jandexIndex,
GlobalRegistrations globalRegistrations,
PersistenceUnitMetadata persistenceUnitMetadata) {
this.classDetailsRegistry = classDetailsRegistry;
this.jandexIndex = jandexIndex;
this.globalRegistrations = globalRegistrations;
this.persistenceUnitMetadata = persistenceUnitMetadata;
}
public ClassDetailsRegistry getClassDetailsRegistry() {
return classDetailsRegistry;
}
public IndexView getJandexIndex() {
return jandexIndex;
}
public GlobalRegistrations getGlobalRegistrations() {
return globalRegistrations;
}
public List<ConversionRegistration> getConversionRegistrations() {
return globalRegistrations.getConverterRegistrations();
}
public Set<ConverterRegistration> getConverterRegistrations() {
return globalRegistrations.getJpaConverters();
}
public PersistenceUnitMetadata getPersistenceUnitMetadata() {
return persistenceUnitMetadata;
}
}

View File

@ -6,10 +6,12 @@
*/ */
package org.hibernate.boot.models; package org.hibernate.boot.models;
import org.hibernate.MappingException;
/** /**
* @author Steve Ebersole * @author Steve Ebersole
*/ */
public class AnnotationPlacementException extends RuntimeException { public class AnnotationPlacementException extends MappingException {
public AnnotationPlacementException(String message) { public AnnotationPlacementException(String message) {
super( message ); super( message );
} }

View File

@ -6,12 +6,14 @@
*/ */
package org.hibernate.boot.models; package org.hibernate.boot.models;
import org.hibernate.MappingException;
/** /**
* Indicates a problem resolving a member from {@linkplain org.hibernate.models.spi.ClassDetails} * Indicates a problem resolving a member from {@linkplain org.hibernate.models.spi.ClassDetails}
* *
* @author Steve Ebersole * @author Steve Ebersole
*/ */
public class MemberResolutionException extends RuntimeException { public class MemberResolutionException extends MappingException {
public MemberResolutionException(String message) { public MemberResolutionException(String message) {
super( message ); super( message );
} }

View File

@ -34,7 +34,12 @@ public class MultipleAttributeNaturesException extends MappingException {
final StringBuilder buffer = new StringBuilder( "Attribute `" ) final StringBuilder buffer = new StringBuilder( "Attribute `" )
.append( attributeName ) .append( attributeName )
.append( "` expressed multiple natures [" ); .append( "` expressed multiple natures [" );
natures.forEach( buffer::append ); String separator = "";
for ( AttributeMetadata.AttributeNature nature : natures ) {
buffer.append( separator );
buffer.append( nature.name() );
separator = ",";
}
return buffer.append( "]" ).toString(); return buffer.append( "]" ).toString();
} }
} }

View File

@ -12,10 +12,12 @@ import java.util.List;
import java.util.Set; import java.util.Set;
import java.util.function.Consumer; import java.util.function.Consumer;
import org.hibernate.boot.models.categorize.spi.ClassAttributeAccessType;
import org.hibernate.boot.models.categorize.spi.EntityHierarchy; import org.hibernate.boot.models.categorize.spi.EntityHierarchy;
import org.hibernate.boot.models.categorize.spi.IdentifiableTypeMetadata; import org.hibernate.boot.models.categorize.spi.IdentifiableTypeMetadata;
import org.hibernate.boot.models.categorize.spi.JpaEventListener; import org.hibernate.boot.models.categorize.spi.JpaEventListener;
import org.hibernate.boot.models.categorize.spi.JpaEventListenerStyle; import org.hibernate.boot.models.categorize.spi.JpaEventListenerStyle;
import org.hibernate.boot.models.categorize.spi.MappedSuperclassTypeMetadata;
import org.hibernate.boot.models.categorize.spi.ModelCategorizationContext; import org.hibernate.boot.models.categorize.spi.ModelCategorizationContext;
import org.hibernate.internal.util.collections.CollectionHelper; import org.hibernate.internal.util.collections.CollectionHelper;
import org.hibernate.models.spi.AnnotationUsage; import org.hibernate.models.spi.AnnotationUsage;
@ -35,33 +37,34 @@ public abstract class AbstractIdentifiableTypeMetadata
extends AbstractManagedTypeMetadata extends AbstractManagedTypeMetadata
implements IdentifiableTypeMetadata { implements IdentifiableTypeMetadata {
private final EntityHierarchy hierarchy; private final EntityHierarchy hierarchy;
private final AbstractIdentifiableTypeMetadata superType; private final IdentifiableTypeMetadata superType;
private final Set<IdentifiableTypeMetadata> subTypes = new HashSet<>(); private final Set<IdentifiableTypeMetadata> subTypes = new HashSet<>();
private final AccessType accessType; private final ClassAttributeAccessType classLevelAccessType;
/** /**
* Used when creating the hierarchy root-root * Used when creating the hierarchy root-root
* *
* @param accessType This is the hierarchy default * @param implicitAccessType This is the hierarchy default
*/ */
public AbstractIdentifiableTypeMetadata( public AbstractIdentifiableTypeMetadata(
ClassDetails classDetails, ClassDetails classDetails,
EntityHierarchy hierarchy, EntityHierarchy hierarchy,
AccessType accessType, MappedSuperclassTypeMetadata superTypeMetadata,
AccessType implicitAccessType,
ModelCategorizationContext processingContext) { ModelCategorizationContext processingContext) {
super( classDetails, processingContext ); super( classDetails, processingContext );
this.hierarchy = hierarchy; this.hierarchy = hierarchy;
this.superType = null; this.superType = superTypeMetadata;
this.accessType = CategorizationHelper.determineAccessType( classDetails, accessType ); this.classLevelAccessType = CategorizationHelper.determineAccessType( classDetails, implicitAccessType );
} }
public AbstractIdentifiableTypeMetadata( public AbstractIdentifiableTypeMetadata(
ClassDetails classDetails, ClassDetails classDetails,
EntityHierarchy hierarchy, EntityHierarchy hierarchy,
AbstractIdentifiableTypeMetadata superType, IdentifiableTypeMetadata superType,
ModelCategorizationContext processingContext) { ModelCategorizationContext processingContext) {
super( classDetails, processingContext ); super( classDetails, processingContext );
@ -70,14 +73,20 @@ public abstract class AbstractIdentifiableTypeMetadata
this.hierarchy = hierarchy; this.hierarchy = hierarchy;
this.superType = superType; this.superType = superType;
this.accessType = CategorizationHelper.determineAccessType( classDetails, superType.getAccessType() ); // this is arguably more logical, but the specification is very clear that this should come
// from the hierarchy default not the super in section _2.3.2 Explicit Access Type_
//this.accessType = CategorizationHelper.determineAccessType( classDetails, superType.getAccessType() );
this.classLevelAccessType = CategorizationHelper.determineAccessType( classDetails, hierarchy.getDefaultAccessType() );
} }
protected void postInstantiate(HierarchyTypeConsumer typeConsumer) { protected void postInstantiate(boolean rootEntityOrSubclass, HierarchyTypeConsumer typeConsumer) {
typeConsumer.acceptType( this ); typeConsumer.acceptType( this );
// now we can effectively walk subs // now we can effectively walk subs, although we skip that for the mapped-superclasses
walkSubclasses( typeConsumer ); // "above" the root entity
if ( rootEntityOrSubclass ) {
walkSubclasses( typeConsumer );
}
// the idea here is to collect up class-level annotations and to apply // the idea here is to collect up class-level annotations and to apply
// the maps from supers // the maps from supers
@ -122,7 +131,7 @@ public abstract class AbstractIdentifiableTypeMetadata
} }
private void addSubclass(IdentifiableTypeMetadata subclass) { protected void addSubclass(IdentifiableTypeMetadata subclass) {
subTypes.add( subclass ); subTypes.add( subclass );
} }
@ -165,8 +174,8 @@ public abstract class AbstractIdentifiableTypeMetadata
} }
@Override @Override
public AccessType getAccessType() { public ClassAttributeAccessType getClassLevelAccessType() {
return accessType; return classLevelAccessType;
} }
protected void collectConversionInfo() { protected void collectConversionInfo() {

View File

@ -134,14 +134,14 @@ public abstract class AbstractManagedTypeMetadata implements ManagedTypeMetadata
protected List<AttributeMetadata> resolveAttributes(AllMemberConsumer memberConsumer) { protected List<AttributeMetadata> resolveAttributes(AllMemberConsumer memberConsumer) {
final List<MemberDetails> backingMembers = getModelContext() final List<MemberDetails> backingMembers = getModelContext()
.getPersistentAttributeMemberResolver() .getPersistentAttributeMemberResolver()
.resolveAttributesMembers( classDetails, getAccessType(), memberConsumer ); .resolveAttributesMembers( classDetails, getClassLevelAccessType(), memberConsumer );
final List<AttributeMetadata> attributeList = arrayList( backingMembers.size() ); final List<AttributeMetadata> attributeList = arrayList( backingMembers.size() );
for ( MemberDetails backingMember : backingMembers ) { for ( MemberDetails backingMember : backingMembers ) {
final AttributeMetadata attribute = new AttributeMetadataImpl( final AttributeMetadata attribute = new AttributeMetadataImpl(
backingMember.resolveAttributeName(), backingMember.resolveAttributeName(),
CategorizationHelper.determineAttributeNature( backingMember ), CategorizationHelper.determineAttributeNature( classDetails, backingMember ),
backingMember backingMember
); );
attributeList.add( attribute ); attributeList.add( attribute );

View File

@ -14,14 +14,13 @@ import java.util.function.Function;
import org.hibernate.boot.models.JpaAnnotations; import org.hibernate.boot.models.JpaAnnotations;
import org.hibernate.boot.models.categorize.spi.AllMemberConsumer; import org.hibernate.boot.models.categorize.spi.AllMemberConsumer;
import org.hibernate.boot.models.categorize.spi.ClassAttributeAccessType;
import org.hibernate.boot.models.categorize.spi.PersistentAttributeMemberResolver; import org.hibernate.boot.models.categorize.spi.PersistentAttributeMemberResolver;
import org.hibernate.models.spi.ClassDetails; import org.hibernate.models.spi.ClassDetails;
import org.hibernate.models.spi.FieldDetails; import org.hibernate.models.spi.FieldDetails;
import org.hibernate.models.spi.MemberDetails; import org.hibernate.models.spi.MemberDetails;
import org.hibernate.models.spi.MethodDetails; import org.hibernate.models.spi.MethodDetails;
import jakarta.persistence.AccessType;
/** /**
* "Template" support for writing PersistentAttributeMemberResolver * "Template" support for writing PersistentAttributeMemberResolver
* implementations. * implementations.
@ -49,12 +48,12 @@ public abstract class AbstractPersistentAttributeMemberResolver implements Persi
Function<FieldDetails,Boolean> transientFieldChecker, Function<FieldDetails,Boolean> transientFieldChecker,
Function<MethodDetails,Boolean> transientMethodChecker, Function<MethodDetails,Boolean> transientMethodChecker,
ClassDetails classDetails, ClassDetails classDetails,
AccessType classLevelAccessType); ClassAttributeAccessType classLevelAccessType);
@Override @Override
public List<MemberDetails> resolveAttributesMembers( public List<MemberDetails> resolveAttributesMembers(
ClassDetails classDetails, ClassDetails classDetails,
AccessType classLevelAccessType, ClassAttributeAccessType classLevelAccessType,
AllMemberConsumer memberConsumer) { AllMemberConsumer memberConsumer) {
final Set<FieldDetails> transientFields = new HashSet<>(); final Set<FieldDetails> transientFields = new HashSet<>();

View File

@ -13,8 +13,9 @@ import org.hibernate.annotations.ManyToAny;
import org.hibernate.boot.models.HibernateAnnotations; import org.hibernate.boot.models.HibernateAnnotations;
import org.hibernate.boot.models.JpaAnnotations; import org.hibernate.boot.models.JpaAnnotations;
import org.hibernate.boot.models.MultipleAttributeNaturesException; import org.hibernate.boot.models.MultipleAttributeNaturesException;
import org.hibernate.boot.models.categorize.ModelCategorizationLogging;
import org.hibernate.boot.models.categorize.spi.AttributeMetadata; import org.hibernate.boot.models.categorize.spi.AttributeMetadata;
import org.hibernate.boot.models.categorize.spi.ClassAttributeAccessType;
import org.hibernate.internal.util.collections.CollectionHelper;
import org.hibernate.models.spi.AnnotationUsage; import org.hibernate.models.spi.AnnotationUsage;
import org.hibernate.models.spi.ClassDetails; import org.hibernate.models.spi.ClassDetails;
import org.hibernate.models.spi.MemberDetails; import org.hibernate.models.spi.MemberDetails;
@ -30,6 +31,14 @@ import jakarta.persistence.ManyToOne;
import jakarta.persistence.OneToMany; import jakarta.persistence.OneToMany;
import jakarta.persistence.OneToOne; import jakarta.persistence.OneToOne;
import static org.hibernate.boot.models.categorize.ModelCategorizationLogging.MODEL_CATEGORIZATION_LOGGER;
import static org.hibernate.boot.models.categorize.spi.AttributeMetadata.AttributeNature.BASIC;
import static org.hibernate.boot.models.categorize.spi.AttributeMetadata.AttributeNature.ELEMENT_COLLECTION;
import static org.hibernate.boot.models.categorize.spi.AttributeMetadata.AttributeNature.EMBEDDED;
import static org.hibernate.boot.models.categorize.spi.AttributeMetadata.AttributeNature.MANY_TO_ANY;
import static org.hibernate.boot.models.categorize.spi.AttributeMetadata.AttributeNature.MANY_TO_MANY;
import static org.hibernate.boot.models.categorize.spi.AttributeMetadata.AttributeNature.ONE_TO_MANY;
/** /**
* @author Steve Ebersole * @author Steve Ebersole
*/ */
@ -46,13 +55,19 @@ public class CategorizationHelper {
return isEntity( classDetails ) || isMappedSuperclass( classDetails ); return isEntity( classDetails ) || isMappedSuperclass( classDetails );
} }
public static AccessType determineAccessType(ClassDetails classDetails, AccessType defaultAccessType) { public static ClassAttributeAccessType determineAccessType(ClassDetails classDetails, AccessType implicitAccessType) {
final AnnotationUsage<Access> annotation = classDetails.getAnnotationUsage( JpaAnnotations.ACCESS ); final AnnotationUsage<Access> annotation = classDetails.getAnnotationUsage( JpaAnnotations.ACCESS );
if ( annotation != null ) { if ( annotation != null ) {
return annotation.getAttributeValue( "value" ); final AccessType explicitValue = annotation.getAttributeValue( "value" );
assert explicitValue != null;
return explicitValue == AccessType.FIELD
? ClassAttributeAccessType.EXPLICIT_FIELD
: ClassAttributeAccessType.EXPLICIT_PROPERTY;
} }
return defaultAccessType; return implicitAccessType == AccessType.FIELD
? ClassAttributeAccessType.IMPLICIT_FIELD
: ClassAttributeAccessType.IMPLICIT_PROPERTY;
} }
/** /**
@ -60,7 +75,7 @@ public class CategorizationHelper {
* </p> * </p>
* Also performs some simple validation around multiple natures being indicated * Also performs some simple validation around multiple natures being indicated
*/ */
public static AttributeMetadata.AttributeNature determineAttributeNature(MemberDetails backingMember) { public static AttributeMetadata.AttributeNature determineAttributeNature(ClassDetails declarer, MemberDetails backingMember) {
final EnumSet<AttributeMetadata.AttributeNature> natures = EnumSet.noneOf( AttributeMetadata.AttributeNature.class ); final EnumSet<AttributeMetadata.AttributeNature> natures = EnumSet.noneOf( AttributeMetadata.AttributeNature.class );
// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
@ -84,78 +99,114 @@ public class CategorizationHelper {
if ( embedded != null if ( embedded != null
|| embeddedId != null || embeddedId != null
|| ( backingMember.getType() != null && backingMember.getType().getAnnotationUsage( JpaAnnotations.EMBEDDABLE ) != null ) ) { || ( backingMember.getType() != null && backingMember.getType().getAnnotationUsage( JpaAnnotations.EMBEDDABLE ) != null ) ) {
natures.add( AttributeMetadata.AttributeNature.EMBEDDED ); natures.add( EMBEDDED );
} }
if ( any != null ) { if ( any != null ) {
natures.add( AttributeMetadata.AttributeNature.ANY ); natures.add( AttributeMetadata.AttributeNature.ANY );
} }
if ( oneToOne != null if ( oneToOne != null || manyToOne != null ) {
|| manyToOne != null ) {
natures.add( AttributeMetadata.AttributeNature.TO_ONE ); natures.add( AttributeMetadata.AttributeNature.TO_ONE );
} }
if ( elementCollection != null ) {
natures.add( ELEMENT_COLLECTION );
}
if ( oneToMany != null ) {
natures.add( ONE_TO_MANY );
}
if ( manyToMany != null ) {
natures.add( MANY_TO_MANY );
}
if ( manyToAny != null ) {
natures.add( MANY_TO_ANY );
}
// look at annotations that imply a nature
final boolean plural = oneToMany != null final boolean plural = oneToMany != null
|| manyToMany != null || manyToMany != null
|| elementCollection != null || elementCollection != null
|| manyToAny != null; || manyToAny != null;
if ( plural ) {
natures.add( AttributeMetadata.AttributeNature.PLURAL );
}
// look at annotations that imply a nature final boolean implicitlyBasic = backingMember.getAnnotationUsage( JpaAnnotations.TEMPORAL ) != null
// NOTE : these could apply to the element or index of collection, so || backingMember.getAnnotationUsage( JpaAnnotations.LOB ) != null
// only do these if it is not a collection || backingMember.getAnnotationUsage( JpaAnnotations.ENUMERATED ) != null
|| backingMember.getAnnotationUsage( JpaAnnotations.VERSION ) != null
|| backingMember.getAnnotationUsage( HibernateAnnotations.GENERATED ) != null
|| backingMember.getAnnotationUsage( HibernateAnnotations.NATIONALIZED ) != null
|| backingMember.getAnnotationUsage( HibernateAnnotations.TZ_COLUMN ) != null
|| backingMember.getAnnotationUsage( HibernateAnnotations.TZ_STORAGE ) != null
|| backingMember.getAnnotationUsage( HibernateAnnotations.TYPE ) != null
|| backingMember.getAnnotationUsage( HibernateAnnotations.TENANT_ID ) != null
|| backingMember.getAnnotationUsage( HibernateAnnotations.JAVA_TYPE ) != null
|| backingMember.getAnnotationUsage( HibernateAnnotations.JDBC_TYPE_CODE ) != null
|| backingMember.getAnnotationUsage( HibernateAnnotations.JDBC_TYPE ) != null;
final boolean implicitlyEmbedded = backingMember.getAnnotationUsage( HibernateAnnotations.EMBEDDABLE_INSTANTIATOR ) != null
|| backingMember.getAnnotationUsage( HibernateAnnotations.COMPOSITE_TYPE ) != null;
final boolean implicitlyAny = backingMember.getAnnotationUsage( HibernateAnnotations.ANY_DISCRIMINATOR ) != null
|| CollectionHelper.isNotEmpty( backingMember.getRepeatedAnnotationUsages( HibernateAnnotations.ANY_DISCRIMINATOR_VALUE ) )
|| backingMember.getAnnotationUsage( HibernateAnnotations.ANY_DISCRIMINATOR_VALUES ) != null
|| backingMember.getAnnotationUsage( HibernateAnnotations.ANY_KEY_JAVA_TYPE ) != null
|| backingMember.getAnnotationUsage( HibernateAnnotations.ANY_KEY_JAVA_CLASS ) != null
|| backingMember.getAnnotationUsage( HibernateAnnotations.ANY_KEY_JDBC_TYPE ) != null
|| backingMember.getAnnotationUsage( HibernateAnnotations.ANY_KEY_JDBC_TYPE_CODE ) != null;
if ( !plural ) { if ( !plural ) {
// first implicit basic nature // first implicit basic nature
if ( backingMember.getAnnotationUsage( JpaAnnotations.TEMPORAL ) != null if ( implicitlyBasic ) {
|| backingMember.getAnnotationUsage( JpaAnnotations.LOB ) != null
|| backingMember.getAnnotationUsage( JpaAnnotations.ENUMERATED ) != null
|| backingMember.getAnnotationUsage( JpaAnnotations.CONVERT ) != null
|| backingMember.getAnnotationUsage( JpaAnnotations.VERSION ) != null
|| backingMember.getAnnotationUsage( HibernateAnnotations.GENERATED ) != null
|| backingMember.getAnnotationUsage( HibernateAnnotations.NATIONALIZED ) != null
|| backingMember.getAnnotationUsage( HibernateAnnotations.TZ_COLUMN ) != null
|| backingMember.getAnnotationUsage( HibernateAnnotations.TZ_STORAGE ) != null
|| backingMember.getAnnotationUsage( HibernateAnnotations.TYPE ) != null
|| backingMember.getAnnotationUsage( HibernateAnnotations.TENANT_ID ) != null
|| backingMember.getAnnotationUsage( HibernateAnnotations.JAVA_TYPE ) != null
|| backingMember.getAnnotationUsage( HibernateAnnotations.JDBC_TYPE_CODE ) != null
|| backingMember.getAnnotationUsage( HibernateAnnotations.JDBC_TYPE ) != null ) {
natures.add( AttributeMetadata.AttributeNature.BASIC ); natures.add( AttributeMetadata.AttributeNature.BASIC );
} }
// then embedded // then embedded
if ( backingMember.getAnnotationUsage( HibernateAnnotations.EMBEDDABLE_INSTANTIATOR ) != null if ( implicitlyEmbedded ) {
|| backingMember.getAnnotationUsage( HibernateAnnotations.COMPOSITE_TYPE ) != null ) { natures.add( EMBEDDED );
natures.add( AttributeMetadata.AttributeNature.EMBEDDED );
} }
// and any // and any
if ( backingMember.getAnnotationUsage( HibernateAnnotations.ANY_DISCRIMINATOR ) != null if ( implicitlyAny ) {
|| backingMember.getAnnotationUsage( HibernateAnnotations.ANY_DISCRIMINATOR_VALUE ) != null
|| backingMember.getAnnotationUsage( HibernateAnnotations.ANY_DISCRIMINATOR_VALUES ) != null
|| backingMember.getAnnotationUsage( HibernateAnnotations.ANY_KEY_JAVA_TYPE ) != null
|| backingMember.getAnnotationUsage( HibernateAnnotations.ANY_KEY_JAVA_CLASS ) != null
|| backingMember.getAnnotationUsage( HibernateAnnotations.ANY_KEY_JDBC_TYPE ) != null
|| backingMember.getAnnotationUsage( HibernateAnnotations.ANY_KEY_JDBC_TYPE_CODE ) != null ) {
natures.add( AttributeMetadata.AttributeNature.ANY ); natures.add( AttributeMetadata.AttributeNature.ANY );
} }
} }
else {
if ( elementCollection != null ) {
// for @ElementCollection, allow `@Basic` or `@Embedded` (though not both)
if ( natures.contains( BASIC ) ) {
if ( natures.contains( EMBEDDED ) ) {
// don't do anything, this is still an error
}
else {
MODEL_CATEGORIZATION_LOGGER.debugf( "Ignoring @Basic on @ElementCollection - %s", backingMember.resolveAttributeName() );
natures.remove( BASIC );
}
}
else if ( natures.contains( EMBEDDED ) ) {
MODEL_CATEGORIZATION_LOGGER.debugf( "Ignoring @Embedded on @ElementCollection - %s", backingMember.resolveAttributeName() );
natures.remove( EMBEDDED );
}
}
}
int size = natures.size(); int size = natures.size();
return switch ( size ) { return switch ( size ) {
case 0 -> { case 0 -> {
ModelCategorizationLogging.MODEL_CATEGORIZATION_LOGGER.debugf( MODEL_CATEGORIZATION_LOGGER.debugf(
"Implicitly interpreting attribute `%s` as BASIC", "Implicitly interpreting attribute `%s` as BASIC",
backingMember.resolveAttributeName() backingMember.resolveAttributeName()
); );
yield AttributeMetadata.AttributeNature.BASIC; yield AttributeMetadata.AttributeNature.BASIC;
} }
case 1 -> natures.iterator().next(); case 1 -> natures.iterator().next();
default -> throw new MultipleAttributeNaturesException( backingMember.resolveAttributeName(), natures ); default -> throw new MultipleAttributeNaturesException(
declarer.getName() + "#" + backingMember.resolveAttributeName(),
natures
);
}; };
} }
} }

View File

@ -12,34 +12,44 @@ import java.util.Set;
import org.hibernate.boot.models.categorize.spi.CategorizedDomainModel; import org.hibernate.boot.models.categorize.spi.CategorizedDomainModel;
import org.hibernate.boot.models.categorize.spi.EntityHierarchy; import org.hibernate.boot.models.categorize.spi.EntityHierarchy;
import org.hibernate.boot.models.categorize.spi.GlobalRegistrations; import org.hibernate.boot.models.categorize.spi.GlobalRegistrations;
import org.hibernate.boot.models.xml.spi.PersistenceUnitMetadata;
import org.hibernate.models.spi.AnnotationDescriptorRegistry; import org.hibernate.models.spi.AnnotationDescriptorRegistry;
import org.hibernate.models.spi.ClassDetails; import org.hibernate.models.spi.ClassDetails;
import org.hibernate.models.spi.ClassDetailsRegistry; import org.hibernate.models.spi.ClassDetailsRegistry;
import org.jboss.jandex.IndexView;
/** /**
* @author Steve Ebersole * @author Steve Ebersole
*/ */
public class CategorizedDomainModelImpl implements CategorizedDomainModel { public class CategorizedDomainModelImpl implements CategorizedDomainModel {
private final ClassDetailsRegistry classDetailsRegistry;
private final AnnotationDescriptorRegistry annotationDescriptorRegistry;
private final Set<EntityHierarchy> entityHierarchies; private final Set<EntityHierarchy> entityHierarchies;
private final Map<String, ClassDetails> mappedSuperclasses; private final Map<String, ClassDetails> mappedSuperclasses;
private final Map<String, ClassDetails> embeddables; private final Map<String, ClassDetails> embeddables;
private final GlobalRegistrations globalRegistrations; private final GlobalRegistrations globalRegistrations;
private final ClassDetailsRegistry classDetailsRegistry;
private final AnnotationDescriptorRegistry annotationDescriptorRegistry;
private final IndexView jandexIndex;
private final PersistenceUnitMetadata persistenceUnitMetadata;
public CategorizedDomainModelImpl( public CategorizedDomainModelImpl(
ClassDetailsRegistry classDetailsRegistry, ClassDetailsRegistry classDetailsRegistry,
AnnotationDescriptorRegistry annotationDescriptorRegistry, AnnotationDescriptorRegistry annotationDescriptorRegistry,
IndexView jandexIndex,
PersistenceUnitMetadata persistenceUnitMetadata,
Set<EntityHierarchy> entityHierarchies, Set<EntityHierarchy> entityHierarchies,
Map<String, ClassDetails> mappedSuperclasses, Map<String, ClassDetails> mappedSuperclasses,
Map<String, ClassDetails> embeddables, Map<String, ClassDetails> embeddables,
GlobalRegistrations globalRegistrations) { GlobalRegistrations globalRegistrations) {
this.classDetailsRegistry = classDetailsRegistry; this.classDetailsRegistry = classDetailsRegistry;
this.annotationDescriptorRegistry = annotationDescriptorRegistry; this.annotationDescriptorRegistry = annotationDescriptorRegistry;
this.persistenceUnitMetadata = persistenceUnitMetadata;
this.entityHierarchies = entityHierarchies; this.entityHierarchies = entityHierarchies;
this.mappedSuperclasses = mappedSuperclasses; this.mappedSuperclasses = mappedSuperclasses;
this.embeddables = embeddables; this.embeddables = embeddables;
this.globalRegistrations = globalRegistrations; this.globalRegistrations = globalRegistrations;
this.jandexIndex = jandexIndex;
} }
@Override @Override
@ -52,6 +62,21 @@ public class CategorizedDomainModelImpl implements CategorizedDomainModel {
return annotationDescriptorRegistry; return annotationDescriptorRegistry;
} }
@Override
public IndexView getJandexIndex() {
return jandexIndex;
}
@Override
public PersistenceUnitMetadata getPersistenceUnitMetadata() {
return persistenceUnitMetadata;
}
@Override
public GlobalRegistrations getGlobalRegistrations() {
return globalRegistrations;
}
@Override @Override
public Set<EntityHierarchy> getEntityHierarchies() { public Set<EntityHierarchy> getEntityHierarchies() {
return entityHierarchies; return entityHierarchies;
@ -65,9 +90,4 @@ public class CategorizedDomainModelImpl implements CategorizedDomainModel {
public Map<String, ClassDetails> getEmbeddables() { public Map<String, ClassDetails> getEmbeddables() {
return embeddables; return embeddables;
} }
@Override
public GlobalRegistrations getGlobalRegistrations() {
return globalRegistrations;
}
} }

View File

@ -18,10 +18,15 @@ import org.hibernate.boot.jaxb.mapping.spi.JaxbPersistenceUnitMetadataImpl;
import org.hibernate.boot.models.categorize.spi.CategorizedDomainModel; import org.hibernate.boot.models.categorize.spi.CategorizedDomainModel;
import org.hibernate.boot.models.categorize.spi.EntityHierarchy; import org.hibernate.boot.models.categorize.spi.EntityHierarchy;
import org.hibernate.boot.models.categorize.spi.ManagedResourcesProcessor; import org.hibernate.boot.models.categorize.spi.ManagedResourcesProcessor;
import org.hibernate.boot.models.xml.spi.PersistenceUnitMetadata;
import org.hibernate.models.spi.AnnotationDescriptorRegistry; import org.hibernate.models.spi.AnnotationDescriptorRegistry;
import org.hibernate.models.spi.ClassDetails; import org.hibernate.models.spi.ClassDetails;
import org.hibernate.models.spi.ClassDetailsRegistry; import org.hibernate.models.spi.ClassDetailsRegistry;
import org.jboss.jandex.IndexView;
import jakarta.persistence.AttributeConverter;
import jakarta.persistence.Converter;
import jakarta.persistence.Embeddable; import jakarta.persistence.Embeddable;
import jakarta.persistence.Entity; import jakarta.persistence.Entity;
import jakarta.persistence.MappedSuperclass; import jakarta.persistence.MappedSuperclass;
@ -36,19 +41,28 @@ import jakarta.persistence.MappedSuperclass;
public class DomainModelCategorizationCollector { public class DomainModelCategorizationCollector {
private final boolean areIdGeneratorsGlobal; private final boolean areIdGeneratorsGlobal;
private final IndexView jandexIndex;
private final GlobalRegistrationsImpl globalRegistrations;
private final Set<ClassDetails> rootEntities = new HashSet<>(); private final Set<ClassDetails> rootEntities = new HashSet<>();
private final Map<String,ClassDetails> mappedSuperclasses = new HashMap<>(); private final Map<String,ClassDetails> mappedSuperclasses = new HashMap<>();
private final Map<String,ClassDetails> embeddables = new HashMap<>(); private final Map<String,ClassDetails> embeddables = new HashMap<>();
private final GlobalRegistrationsImpl globalRegistrations;
public DomainModelCategorizationCollector( public DomainModelCategorizationCollector(
boolean areIdGeneratorsGlobal, boolean areIdGeneratorsGlobal,
ClassDetailsRegistry classDetailsRegistry, ClassDetailsRegistry classDetailsRegistry,
AnnotationDescriptorRegistry descriptorRegistry) { AnnotationDescriptorRegistry descriptorRegistry,
IndexView jandexIndex) {
this.areIdGeneratorsGlobal = areIdGeneratorsGlobal; this.areIdGeneratorsGlobal = areIdGeneratorsGlobal;
this.jandexIndex = jandexIndex;
this.globalRegistrations = new GlobalRegistrationsImpl( classDetailsRegistry, descriptorRegistry ); this.globalRegistrations = new GlobalRegistrationsImpl( classDetailsRegistry, descriptorRegistry );
} }
public GlobalRegistrationsImpl getGlobalRegistrations() {
return globalRegistrations;
}
public Set<ClassDetails> getRootEntities() { public Set<ClassDetails> getRootEntities() {
return rootEntities; return rootEntities;
} }
@ -61,15 +75,11 @@ public class DomainModelCategorizationCollector {
return embeddables; return embeddables;
} }
public GlobalRegistrationsImpl getGlobalRegistrations() {
return globalRegistrations;
}
public void apply(JaxbEntityMappingsImpl jaxbRoot) { public void apply(JaxbEntityMappingsImpl jaxbRoot) {
getGlobalRegistrations().collectJavaTypeRegistrations( jaxbRoot.getJavaTypeRegistrations() ); getGlobalRegistrations().collectJavaTypeRegistrations( jaxbRoot.getJavaTypeRegistrations() );
getGlobalRegistrations().collectJdbcTypeRegistrations( jaxbRoot.getJdbcTypeRegistrations() ); getGlobalRegistrations().collectJdbcTypeRegistrations( jaxbRoot.getJdbcTypeRegistrations() );
getGlobalRegistrations().collectConverterRegistrations( jaxbRoot.getConverterRegistrations() ); getGlobalRegistrations().collectConverterRegistrations( jaxbRoot.getConverterRegistrations() );
getGlobalRegistrations().collectConverters( jaxbRoot.getConverters() );
getGlobalRegistrations().collectUserTypeRegistrations( jaxbRoot.getUserTypeRegistrations() ); getGlobalRegistrations().collectUserTypeRegistrations( jaxbRoot.getUserTypeRegistrations() );
getGlobalRegistrations().collectCompositeUserTypeRegistrations( jaxbRoot.getCompositeUserTypeRegistrations() ); getGlobalRegistrations().collectCompositeUserTypeRegistrations( jaxbRoot.getCompositeUserTypeRegistrations() );
getGlobalRegistrations().collectCollectionTypeRegistrations( jaxbRoot.getCollectionUserTypeRegistrations() ); getGlobalRegistrations().collectCollectionTypeRegistrations( jaxbRoot.getCollectionUserTypeRegistrations() );
@ -79,9 +89,11 @@ public class DomainModelCategorizationCollector {
final JaxbPersistenceUnitMetadataImpl persistenceUnitMetadata = jaxbRoot.getPersistenceUnitMetadata(); final JaxbPersistenceUnitMetadataImpl persistenceUnitMetadata = jaxbRoot.getPersistenceUnitMetadata();
if ( persistenceUnitMetadata != null ) { if ( persistenceUnitMetadata != null ) {
final JaxbPersistenceUnitDefaultsImpl persistenceUnitDefaults = persistenceUnitMetadata.getPersistenceUnitDefaults(); final JaxbPersistenceUnitDefaultsImpl persistenceUnitDefaults = persistenceUnitMetadata.getPersistenceUnitDefaults();
final JaxbEntityListenerContainerImpl listenerContainer = persistenceUnitDefaults.getEntityListenerContainer(); if ( persistenceUnitDefaults != null ) {
if ( listenerContainer != null ) { final JaxbEntityListenerContainerImpl listenerContainer = persistenceUnitDefaults.getEntityListenerContainer();
getGlobalRegistrations().collectEntityListenerRegistrations( listenerContainer.getEntityListeners() ); if ( listenerContainer != null ) {
getGlobalRegistrations().collectEntityListenerRegistrations( listenerContainer.getEntityListeners() );
}
} }
} }
@ -105,6 +117,8 @@ public class DomainModelCategorizationCollector {
getGlobalRegistrations().collectIdGenerators( classDetails ); getGlobalRegistrations().collectIdGenerators( classDetails );
} }
getGlobalRegistrations().collectImportRename( classDetails );
// todo : named queries // todo : named queries
// todo : named graphs // todo : named graphs
@ -124,7 +138,10 @@ public class DomainModelCategorizationCollector {
} }
} }
// todo : converters? - @Converter / AttributeConverter, as opposed to @ConverterRegistration which is already collected if ( ( classDetails.getClassName() != null && classDetails.isImplementor( AttributeConverter.class ) )
|| classDetails.getAnnotationUsage( Converter.class ) != null ) {
globalRegistrations.collectConverter( classDetails );
}
} }
/** /**
@ -138,11 +155,14 @@ public class DomainModelCategorizationCollector {
*/ */
public CategorizedDomainModel createResult( public CategorizedDomainModel createResult(
Set<EntityHierarchy> entityHierarchies, Set<EntityHierarchy> entityHierarchies,
PersistenceUnitMetadata persistenceUnitMetadata,
ClassDetailsRegistry classDetailsRegistry, ClassDetailsRegistry classDetailsRegistry,
AnnotationDescriptorRegistry annotationDescriptorRegistry) { AnnotationDescriptorRegistry annotationDescriptorRegistry) {
return new CategorizedDomainModelImpl( return new CategorizedDomainModelImpl(
classDetailsRegistry, classDetailsRegistry,
annotationDescriptorRegistry, annotationDescriptorRegistry,
jandexIndex,
persistenceUnitMetadata,
entityHierarchies, entityHierarchies,
mappedSuperclasses, mappedSuperclasses,
embeddables, embeddables,

View File

@ -97,15 +97,46 @@ public class EntityHierarchyBuilder {
private AccessType determineDefaultAccessTypeForHierarchy(ClassDetails rootEntityType) { private AccessType determineDefaultAccessTypeForHierarchy(ClassDetails rootEntityType) {
assert rootEntityType != null; assert rootEntityType != null;
// // look for `@Access` at class level
// final AccessType classAnnotationValue = resolveDefaultAccessTypeFromClassAnnotation( rootEntityType );
// if ( classAnnotationValue != null ) {
// return classAnnotationValue;
// }
// look for `@Id` or `@EmbeddedId`
// todo (jpa32) : technically we could probably look for member with any "mapping" annotation
final AccessType accessFromAttribute = resolveDefaultAccessTypeFromMembers( rootEntityType );
if ( accessFromAttribute != null ) {
return accessFromAttribute;
}
// // 2.3.1 Default Access Type
// // It is an error if a default access type cannot be determined and an access type is not explicitly specified
// // by means of annotations or the XML descriptor.
// throw new AccessTypeDeterminationException( rootEntityType );
return null;
}
private AccessType resolveDefaultAccessTypeFromClassAnnotation(ClassDetails rootEntityType) {
ClassDetails current = rootEntityType; ClassDetails current = rootEntityType;
while ( current != null ) { while ( current != null ) {
// look for `@Access` on the class
final AnnotationUsage<Access> accessAnnotation = current.getAnnotationUsage( JpaAnnotations.ACCESS ); final AnnotationUsage<Access> accessAnnotation = current.getAnnotationUsage( JpaAnnotations.ACCESS );
if ( accessAnnotation != null ) { if ( accessAnnotation != null ) {
return accessAnnotation.getAttributeValue( "value" ); return accessAnnotation.getAttributeValue( "value" );
} }
// look for `@Id` or `@EmbeddedId` current = current.getSuperType();
}
return null;
}
private AccessType resolveDefaultAccessTypeFromMembers(ClassDetails rootEntityType) {
ClassDetails current = rootEntityType;
while ( current != null ) {
// look for `@Id` or `@EmbeddedId` (w/o `@Access`)
final AnnotationTarget idMember = determineIdMember( current ); final AnnotationTarget idMember = determineIdMember( current );
if ( idMember != null ) { if ( idMember != null ) {
switch ( idMember.getKind() ) { switch ( idMember.getKind() ) {
@ -124,11 +155,7 @@ public class EntityHierarchyBuilder {
current = current.getSuperType(); current = current.getSuperType();
} }
// 2.3.1 Default Access Type return null;
// It is an error if a default access type cannot be determined and an access type is not explicitly specified
// by means of annotations or the XML descriptor.
throw new AccessTypeDeterminationException( rootEntityType );
} }
private AnnotationTarget determineIdMember(ClassDetails current) { private AnnotationTarget determineIdMember(ClassDetails current) {
@ -137,7 +164,9 @@ public class EntityHierarchyBuilder {
final MethodDetails methodDetails = methods.get( i ); final MethodDetails methodDetails = methods.get( i );
if ( methodDetails.getAnnotationUsage( JpaAnnotations.ID ) != null if ( methodDetails.getAnnotationUsage( JpaAnnotations.ID ) != null
|| methodDetails.getAnnotationUsage( JpaAnnotations.EMBEDDED_ID ) != null ) { || methodDetails.getAnnotationUsage( JpaAnnotations.EMBEDDED_ID ) != null ) {
return methodDetails; if ( methodDetails.getAnnotationUsage( Access.class ) == null ) {
return methodDetails;
}
} }
} }
@ -146,7 +175,9 @@ public class EntityHierarchyBuilder {
final FieldDetails fieldDetails = fields.get( i ); final FieldDetails fieldDetails = fields.get( i );
if ( fieldDetails.getAnnotationUsage( JpaAnnotations.ID ) != null if ( fieldDetails.getAnnotationUsage( JpaAnnotations.ID ) != null
|| fieldDetails.getAnnotationUsage( JpaAnnotations.EMBEDDED_ID ) != null ) { || fieldDetails.getAnnotationUsage( JpaAnnotations.EMBEDDED_ID ) != null ) {
return fieldDetails; if ( fieldDetails.getAnnotationUsage( Access.class ) == null ) {
return fieldDetails;
}
} }
} }
@ -183,8 +214,8 @@ public class EntityHierarchyBuilder {
ClassDetails current = classInfo.getSuperType(); ClassDetails current = classInfo.getSuperType();
while ( current != null ) { while ( current != null ) {
if ( current.getAnnotationUsage( JpaAnnotations.ENTITY ) != null ) { if ( current.getAnnotationUsage( JpaAnnotations.ENTITY ) != null && !current.isAbstract() ) {
// a super type has `@Entity`, cannot be root // a non-abstract super type has `@Entity` -> classInfo cannot be a root entity
return false; return false;
} }
current = current.getSuperType(); current = current.getSuperType();

View File

@ -38,6 +38,7 @@ public class EntityHierarchyImpl implements EntityHierarchy {
private final EntityTypeMetadata rootEntityTypeMetadata; private final EntityTypeMetadata rootEntityTypeMetadata;
private final InheritanceType inheritanceType; private final InheritanceType inheritanceType;
private final jakarta.persistence.AccessType defaultAccessType;
private final OptimisticLockStyle optimisticLockStyle; private final OptimisticLockStyle optimisticLockStyle;
private final KeyMapping idMapping; private final KeyMapping idMapping;
@ -54,32 +55,39 @@ public class EntityHierarchyImpl implements EntityHierarchy {
AccessType defaultCacheAccessType, AccessType defaultCacheAccessType,
HierarchyTypeConsumer typeConsumer, HierarchyTypeConsumer typeConsumer,
ModelCategorizationContext modelBuildingContext) { ModelCategorizationContext modelBuildingContext) {
this.defaultAccessType = defaultAccessType;
final ClassDetails absoluteRootClassDetails = findRootRoot( rootEntityClassDetails ); final ClassDetails absoluteRootClassDetails = findRootRoot( rootEntityClassDetails );
final HierarchyMetadataCollector metadataCollector = new HierarchyMetadataCollector( this, rootEntityClassDetails, typeConsumer ); final HierarchyMetadataCollector metadataCollector = new HierarchyMetadataCollector( this, rootEntityClassDetails, typeConsumer );
if ( CategorizationHelper.isEntity( absoluteRootClassDetails ) ) { if ( CategorizationHelper.isEntity( absoluteRootClassDetails ) ) {
this.absoluteRootTypeMetadata = new EntityTypeMetadataImpl( this.rootEntityTypeMetadata = new EntityTypeMetadataImpl(
absoluteRootClassDetails, absoluteRootClassDetails,
this, this,
defaultAccessType, defaultAccessType,
metadataCollector, metadataCollector,
modelBuildingContext modelBuildingContext
); );
this.absoluteRootTypeMetadata = rootEntityTypeMetadata;
} }
else { else {
assert CategorizationHelper.isMappedSuperclass( absoluteRootClassDetails ); assert CategorizationHelper.isMappedSuperclass( absoluteRootClassDetails );
this.absoluteRootTypeMetadata = new MappedSuperclassTypeMetadataImpl( this.absoluteRootTypeMetadata = processRootMappedSuperclasses(
absoluteRootClassDetails, absoluteRootClassDetails,
this, this,
defaultAccessType, defaultAccessType,
metadataCollector, metadataCollector,
modelBuildingContext modelBuildingContext
); );
this.rootEntityTypeMetadata = new EntityTypeMetadataImpl(
rootEntityClassDetails,
this,
(AbstractIdentifiableTypeMetadata) absoluteRootTypeMetadata,
metadataCollector,
modelBuildingContext
);
} }
this.rootEntityTypeMetadata = metadataCollector.getRootEntityMetadata();
assert rootEntityTypeMetadata != null;
this.inheritanceType = determineInheritanceType( metadataCollector ); this.inheritanceType = determineInheritanceType( metadataCollector );
this.optimisticLockStyle = determineOptimisticLockStyle( metadataCollector ); this.optimisticLockStyle = determineOptimisticLockStyle( metadataCollector );
@ -92,6 +100,22 @@ public class EntityHierarchyImpl implements EntityHierarchy {
this.naturalIdCacheRegion = determineNaturalIdCacheRegion( metadataCollector, cacheRegion ); this.naturalIdCacheRegion = determineNaturalIdCacheRegion( metadataCollector, cacheRegion );
} }
private static IdentifiableTypeMetadata processRootMappedSuperclasses(
ClassDetails absoluteRootClassDetails,
EntityHierarchyImpl entityHierarchy,
jakarta.persistence.AccessType defaultAccessType,
HierarchyMetadataCollector metadataCollector,
ModelCategorizationContext modelBuildingContext) {
return new MappedSuperclassTypeMetadataImpl(
absoluteRootClassDetails,
entityHierarchy,
null,
defaultAccessType,
metadataCollector,
modelBuildingContext
);
}
private ClassDetails findRootRoot(ClassDetails rootEntityClassDetails) { private ClassDetails findRootRoot(ClassDetails rootEntityClassDetails) {
if ( rootEntityClassDetails.getSuperType() != null ) { if ( rootEntityClassDetails.getSuperType() != null ) {
final ClassDetails match = walkSupers( rootEntityClassDetails.getSuperType() ); final ClassDetails match = walkSupers( rootEntityClassDetails.getSuperType() );
@ -134,6 +158,11 @@ public class EntityHierarchyImpl implements EntityHierarchy {
return inheritanceType; return inheritanceType;
} }
@Override
public jakarta.persistence.AccessType getDefaultAccessType() {
return defaultAccessType;
}
@Override @Override
public KeyMapping getIdMapping() { public KeyMapping getIdMapping() {
return idMapping; return idMapping;

View File

@ -6,7 +6,11 @@
*/ */
package org.hibernate.boot.models.categorize.internal; package org.hibernate.boot.models.categorize.internal;
import java.lang.annotation.Annotation;
import java.util.Collections;
import java.util.HashMap;
import java.util.List; import java.util.List;
import java.util.Map;
import org.hibernate.annotations.BatchSize; import org.hibernate.annotations.BatchSize;
import org.hibernate.annotations.DynamicInsert; import org.hibernate.annotations.DynamicInsert;
@ -28,6 +32,7 @@ import org.hibernate.boot.models.categorize.spi.EntityTypeMetadata;
import org.hibernate.boot.models.categorize.spi.JpaEventListener; import org.hibernate.boot.models.categorize.spi.JpaEventListener;
import org.hibernate.boot.models.categorize.spi.ModelCategorizationContext; import org.hibernate.boot.models.categorize.spi.ModelCategorizationContext;
import org.hibernate.engine.spi.ExecuteUpdateResultCheckStyle; import org.hibernate.engine.spi.ExecuteUpdateResultCheckStyle;
import org.hibernate.internal.util.collections.CollectionHelper;
import org.hibernate.models.spi.AnnotationUsage; import org.hibernate.models.spi.AnnotationUsage;
import org.hibernate.models.spi.ClassDetails; import org.hibernate.models.spi.ClassDetails;
@ -60,21 +65,24 @@ public class EntityTypeMetadataImpl
private final boolean isSelectBeforeUpdate; private final boolean isSelectBeforeUpdate;
private final boolean isDynamicInsert; private final boolean isDynamicInsert;
private final boolean isDynamicUpdate; private final boolean isDynamicUpdate;
private final CustomSql customInsert; private final Map<String,CustomSql> customInsertMap;
private final CustomSql customUpdate; private final Map<String,CustomSql> customUpdateMap;
private final CustomSql customDelete; private final Map<String,CustomSql> customDeleteMap;
private final String[] synchronizedTableNames; private final String[] synchronizedTableNames;
private List<JpaEventListener> hierarchyEventListeners; private List<JpaEventListener> hierarchyEventListeners;
private List<JpaEventListener> completeEventListeners; private List<JpaEventListener> completeEventListeners;
/**
* Form used when the entity is the absolute-root (no mapped-super) of the hierarchy
*/
public EntityTypeMetadataImpl( public EntityTypeMetadataImpl(
ClassDetails classDetails, ClassDetails classDetails,
EntityHierarchy hierarchy, EntityHierarchy hierarchy,
AccessType defaultAccessType, AccessType defaultAccessType,
HierarchyTypeConsumer typeConsumer, HierarchyTypeConsumer typeConsumer,
ModelCategorizationContext modelContext) { ModelCategorizationContext modelContext) {
super( classDetails, hierarchy, defaultAccessType, modelContext ); super( classDetails, hierarchy, null, defaultAccessType, modelContext );
// NOTE: There is no annotation for `entity-name` - it comes exclusively from XML // NOTE: There is no annotation for `entity-name` - it comes exclusively from XML
// mappings. By default, the `entityName` is simply the entity class name. // mappings. By default, the `entityName` is simply the entity class name.
@ -96,9 +104,9 @@ public class EntityTypeMetadataImpl
this.isSelectBeforeUpdate = decodeSelectBeforeUpdate(); this.isSelectBeforeUpdate = decodeSelectBeforeUpdate();
this.isDynamicInsert = decodeDynamicInsert(); this.isDynamicInsert = decodeDynamicInsert();
this.isDynamicUpdate = decodeDynamicUpdate(); this.isDynamicUpdate = decodeDynamicUpdate();
this.customInsert = extractCustomSql( classDetails.getAnnotationUsage( SQLInsert.class ) ); this.customInsertMap = extractCustomSql( classDetails, SQLInsert.class );
this.customUpdate = extractCustomSql( classDetails.getAnnotationUsage( SQLUpdate.class ) ); this.customUpdateMap = extractCustomSql( classDetails, SQLUpdate.class );
this.customDelete = extractCustomSql( classDetails.getAnnotationUsage( SQLDelete.class ) ); this.customDeleteMap = extractCustomSql( classDetails, SQLDelete.class );
//noinspection deprecation //noinspection deprecation
final AnnotationUsage<Proxy> proxyAnnotation = classDetails.getAnnotationUsage( Proxy.class ); final AnnotationUsage<Proxy> proxyAnnotation = classDetails.getAnnotationUsage( Proxy.class );
@ -133,9 +141,12 @@ public class EntityTypeMetadataImpl
this.discriminatorMatchValue = null; this.discriminatorMatchValue = null;
} }
postInstantiate( typeConsumer ); postInstantiate( true, typeConsumer );
} }
/**
* Form used when the entity is NOT the absolute-root of the hierarchy
*/
public EntityTypeMetadataImpl( public EntityTypeMetadataImpl(
ClassDetails classDetails, ClassDetails classDetails,
EntityHierarchy hierarchy, EntityHierarchy hierarchy,
@ -164,9 +175,9 @@ public class EntityTypeMetadataImpl
this.isSelectBeforeUpdate = decodeSelectBeforeUpdate(); this.isSelectBeforeUpdate = decodeSelectBeforeUpdate();
this.isDynamicInsert = decodeDynamicInsert(); this.isDynamicInsert = decodeDynamicInsert();
this.isDynamicUpdate = decodeDynamicUpdate(); this.isDynamicUpdate = decodeDynamicUpdate();
this.customInsert = extractCustomSql( classDetails.getAnnotationUsage( SQLInsert.class ) ); this.customInsertMap = extractCustomSql( classDetails, SQLInsert.class );
this.customUpdate = extractCustomSql( classDetails.getAnnotationUsage( SQLUpdate.class ) ); this.customUpdateMap = extractCustomSql( classDetails, SQLUpdate.class );
this.customDelete = extractCustomSql( classDetails.getAnnotationUsage( SQLDelete.class ) ); this.customDeleteMap = extractCustomSql( classDetails, SQLDelete.class );
//noinspection deprecation //noinspection deprecation
final AnnotationUsage<Proxy> proxyAnnotation = classDetails.getAnnotationUsage( Proxy.class ); final AnnotationUsage<Proxy> proxyAnnotation = classDetails.getAnnotationUsage( Proxy.class );
@ -201,7 +212,7 @@ public class EntityTypeMetadataImpl
this.discriminatorMatchValue = null; this.discriminatorMatchValue = null;
} }
postInstantiate( typeConsumer ); postInstantiate( true, typeConsumer );
} }
@Override @Override
@ -260,18 +271,18 @@ public class EntityTypeMetadataImpl
} }
@Override @Override
public CustomSql getCustomInsert() { public Map<String, CustomSql> getCustomInserts() {
return customInsert; return customInsertMap;
} }
@Override @Override
public CustomSql getCustomUpdate() { public Map<String, CustomSql> getCustomUpdates() {
return customUpdate; return customUpdateMap;
} }
@Override @Override
public CustomSql getCustomDelete() { public Map<String, CustomSql> getCustomDeletes() {
return customDelete; return customDeleteMap;
} }
public String getDiscriminatorMatchValue() { public String getDiscriminatorMatchValue() {
@ -355,26 +366,34 @@ public class EntityTypeMetadataImpl
* {@link SQLUpdate}, {@link SQLDelete} * {@link SQLUpdate}, {@link SQLDelete}
* or {@link org.hibernate.annotations.SQLDeleteAll} annotations * or {@link org.hibernate.annotations.SQLDeleteAll} annotations
*/ */
public static CustomSql extractCustomSql(AnnotationUsage<?> customSqlAnnotation) { public static <A extends Annotation> Map<String,CustomSql> extractCustomSql(ClassDetails classDetails, Class<A> annotationType) {
if ( customSqlAnnotation == null ) { final List<AnnotationUsage<A>> annotationUsages = classDetails.getRepeatedAnnotationUsages( annotationType );
return null; if ( CollectionHelper.isEmpty( annotationUsages ) ) {
return Collections.emptyMap();
} }
final String sql = customSqlAnnotation.getAttributeValue( "sql" ); final Map<String, CustomSql> result = new HashMap<>();
final boolean isCallable = customSqlAnnotation.getAttributeValue( "callable" ); annotationUsages.forEach( (customSqlAnnotation) -> {
final String sql = customSqlAnnotation.getAttributeValue( "sql" );
final boolean isCallable = customSqlAnnotation.getAttributeValue( "callable" );
final ResultCheckStyle checkValue = customSqlAnnotation.getAttributeValue( "check" ); final ResultCheckStyle checkValue = customSqlAnnotation.getAttributeValue( "check" );
final ExecuteUpdateResultCheckStyle checkStyle; final ExecuteUpdateResultCheckStyle checkStyle;
if ( checkValue == null ) { if ( checkValue == null ) {
checkStyle = isCallable checkStyle = isCallable
? ExecuteUpdateResultCheckStyle.NONE ? ExecuteUpdateResultCheckStyle.NONE
: ExecuteUpdateResultCheckStyle.COUNT; : ExecuteUpdateResultCheckStyle.COUNT;
} }
else { else {
checkStyle = ExecuteUpdateResultCheckStyle.fromResultCheckStyle( checkValue ); checkStyle = ExecuteUpdateResultCheckStyle.fromResultCheckStyle( checkValue );
} }
return new CustomSql( sql, isCallable, checkStyle ); result.put(
customSqlAnnotation.getString( "table" ),
new CustomSql( sql, isCallable, checkStyle )
);
} );
return result;
} }
private String[] determineSynchronizedTableNames() { private String[] determineSynchronizedTableNames() {

View File

@ -10,17 +10,20 @@ import java.lang.annotation.Annotation;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Collections; import java.util.Collections;
import java.util.HashMap; import java.util.HashMap;
import java.util.HashSet;
import java.util.List; import java.util.List;
import java.util.Map; import java.util.Map;
import java.util.Set;
import org.hibernate.AnnotationException;
import org.hibernate.annotations.FilterDef; import org.hibernate.annotations.FilterDef;
import org.hibernate.annotations.GenericGenerator; import org.hibernate.annotations.GenericGenerator;
import org.hibernate.annotations.Imported;
import org.hibernate.annotations.ParamDef; import org.hibernate.annotations.ParamDef;
import org.hibernate.annotations.Parameter; import org.hibernate.annotations.Parameter;
import org.hibernate.boot.jaxb.mapping.spi.JaxbCollectionUserTypeRegistrationImpl; import org.hibernate.boot.jaxb.mapping.spi.JaxbCollectionUserTypeRegistrationImpl;
import org.hibernate.boot.jaxb.mapping.spi.JaxbCompositeUserTypeRegistrationImpl; import org.hibernate.boot.jaxb.mapping.spi.JaxbCompositeUserTypeRegistrationImpl;
import org.hibernate.boot.jaxb.mapping.spi.JaxbConfigurationParameterImpl; import org.hibernate.boot.jaxb.mapping.spi.JaxbConfigurationParameterImpl;
import org.hibernate.boot.jaxb.mapping.spi.JaxbConverterImpl;
import org.hibernate.boot.jaxb.mapping.spi.JaxbConverterRegistrationImpl; import org.hibernate.boot.jaxb.mapping.spi.JaxbConverterRegistrationImpl;
import org.hibernate.boot.jaxb.mapping.spi.JaxbEmbeddableInstantiatorRegistrationImpl; import org.hibernate.boot.jaxb.mapping.spi.JaxbEmbeddableInstantiatorRegistrationImpl;
import org.hibernate.boot.jaxb.mapping.spi.JaxbEntityListenerImpl; import org.hibernate.boot.jaxb.mapping.spi.JaxbEntityListenerImpl;
@ -35,6 +38,7 @@ import org.hibernate.boot.jaxb.mapping.spi.JaxbUserTypeRegistrationImpl;
import org.hibernate.boot.models.categorize.spi.CollectionTypeRegistration; import org.hibernate.boot.models.categorize.spi.CollectionTypeRegistration;
import org.hibernate.boot.models.categorize.spi.CompositeUserTypeRegistration; import org.hibernate.boot.models.categorize.spi.CompositeUserTypeRegistration;
import org.hibernate.boot.models.categorize.spi.ConversionRegistration; import org.hibernate.boot.models.categorize.spi.ConversionRegistration;
import org.hibernate.boot.models.categorize.spi.ConverterRegistration;
import org.hibernate.boot.models.categorize.spi.EmbeddableInstantiatorRegistration; import org.hibernate.boot.models.categorize.spi.EmbeddableInstantiatorRegistration;
import org.hibernate.boot.models.categorize.spi.FilterDefRegistration; import org.hibernate.boot.models.categorize.spi.FilterDefRegistration;
import org.hibernate.boot.models.categorize.spi.GenericGeneratorRegistration; import org.hibernate.boot.models.categorize.spi.GenericGeneratorRegistration;
@ -46,7 +50,7 @@ import org.hibernate.boot.models.categorize.spi.JpaEventListenerStyle;
import org.hibernate.boot.models.categorize.spi.SequenceGeneratorRegistration; import org.hibernate.boot.models.categorize.spi.SequenceGeneratorRegistration;
import org.hibernate.boot.models.categorize.spi.TableGeneratorRegistration; import org.hibernate.boot.models.categorize.spi.TableGeneratorRegistration;
import org.hibernate.boot.models.categorize.spi.UserTypeRegistration; import org.hibernate.boot.models.categorize.spi.UserTypeRegistration;
import org.hibernate.boot.models.categorize.xml.internal.XmlAnnotationHelper; import org.hibernate.boot.models.xml.internal.XmlAnnotationHelper;
import org.hibernate.internal.util.StringHelper; import org.hibernate.internal.util.StringHelper;
import org.hibernate.internal.util.collections.CollectionHelper; import org.hibernate.internal.util.collections.CollectionHelper;
import org.hibernate.metamodel.CollectionClassification; import org.hibernate.metamodel.CollectionClassification;
@ -65,6 +69,7 @@ import jakarta.persistence.TableGenerator;
import static java.util.Collections.emptyList; import static java.util.Collections.emptyList;
import static java.util.Collections.emptyMap; import static java.util.Collections.emptyMap;
import static java.util.Collections.emptySet;
import static org.hibernate.boot.models.HibernateAnnotations.COLLECTION_TYPE_REG; import static org.hibernate.boot.models.HibernateAnnotations.COLLECTION_TYPE_REG;
import static org.hibernate.boot.models.HibernateAnnotations.COMPOSITE_TYPE_REG; import static org.hibernate.boot.models.HibernateAnnotations.COMPOSITE_TYPE_REG;
import static org.hibernate.boot.models.HibernateAnnotations.CONVERTER_REG; import static org.hibernate.boot.models.HibernateAnnotations.CONVERTER_REG;
@ -91,11 +96,14 @@ public class GlobalRegistrationsImpl implements GlobalRegistrations {
private List<CollectionTypeRegistration> collectionTypeRegistrations; private List<CollectionTypeRegistration> collectionTypeRegistrations;
private List<EmbeddableInstantiatorRegistration> embeddableInstantiatorRegistrations; private List<EmbeddableInstantiatorRegistration> embeddableInstantiatorRegistrations;
private Map<String, FilterDefRegistration> filterDefRegistrations; private Map<String, FilterDefRegistration> filterDefRegistrations;
private Map<String,String> importedRenameMap;
private Map<String, SequenceGeneratorRegistration> sequenceGeneratorRegistrations; private Map<String, SequenceGeneratorRegistration> sequenceGeneratorRegistrations;
private Map<String, TableGeneratorRegistration> tableGeneratorRegistrations; private Map<String, TableGeneratorRegistration> tableGeneratorRegistrations;
private Map<String, GenericGeneratorRegistration> genericGeneratorRegistrations; private Map<String, GenericGeneratorRegistration> genericGeneratorRegistrations;
private Set<ConverterRegistration> jpaConverters;
public GlobalRegistrationsImpl(SourceModelContext sourceModelContext) { public GlobalRegistrationsImpl(SourceModelContext sourceModelContext) {
this( sourceModelContext.getClassDetailsRegistry(), sourceModelContext.getAnnotationDescriptorRegistry() ); this( sourceModelContext.getClassDetailsRegistry(), sourceModelContext.getAnnotationDescriptorRegistry() );
} }
@ -150,6 +158,11 @@ public class GlobalRegistrationsImpl implements GlobalRegistrations {
return filterDefRegistrations == null ? emptyMap() : filterDefRegistrations; return filterDefRegistrations == null ? emptyMap() : filterDefRegistrations;
} }
@Override
public Map<String, String> getImportedRenames() {
return importedRenameMap == null ? emptyMap() : importedRenameMap;
}
@Override @Override
public Map<String, SequenceGeneratorRegistration> getSequenceGeneratorRegistrations() { public Map<String, SequenceGeneratorRegistration> getSequenceGeneratorRegistrations() {
return sequenceGeneratorRegistrations == null ? emptyMap() : sequenceGeneratorRegistrations; return sequenceGeneratorRegistrations == null ? emptyMap() : sequenceGeneratorRegistrations;
@ -165,6 +178,12 @@ public class GlobalRegistrationsImpl implements GlobalRegistrations {
return genericGeneratorRegistrations == null ? emptyMap() : genericGeneratorRegistrations; return genericGeneratorRegistrations == null ? emptyMap() : genericGeneratorRegistrations;
} }
@Override
public Set<ConverterRegistration> getJpaConverters() {
return jpaConverters == null ? emptySet() : jpaConverters;
}
// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
// JavaTypeRegistration // JavaTypeRegistration
@ -472,11 +491,40 @@ public class GlobalRegistrationsImpl implements GlobalRegistrations {
filterDefRegistrations = new HashMap<>(); filterDefRegistrations = new HashMap<>();
} }
if ( filterDefRegistrations.put( name, new FilterDefRegistration( name, defaultCondition, parameters ) ) != null ) { final FilterDefRegistration previousEntry = filterDefRegistrations.put(
throw new AnnotationException( "Multiple '@FilterDef' annotations define a filter named '" + name + "'" ); name,
new FilterDefRegistration( name, defaultCondition, parameters )
);
if ( previousEntry != null ) {
// legacy code simply allows the collision overwriting the previous
// todo (jpa32) : re-enable this, especially if the conditions differ
//throw new AnnotationException( "Multiple '@FilterDef' annotations define a filter named '" + name + "'" );
} }
} }
public void collectImportRename(ClassDetails classDetails) {
final AnnotationUsage<Imported> importedUsage = classDetails.getAnnotationUsage( Imported.class );
if ( importedUsage == null ) {
return;
}
final String explicitRename = importedUsage.getString( "rename" );
final String rename = StringHelper.isNotEmpty( explicitRename )
? explicitRename
: StringHelper.unqualify( classDetails.getName() );
collectImportRename( rename, classDetails.getName() );
}
public void collectImportRename(String rename, String name) {
if ( importedRenameMap == null ) {
importedRenameMap = new HashMap<>();
}
importedRenameMap.put( rename, name );
}
// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
// EntityListenerRegistration // EntityListenerRegistration
@ -630,4 +678,35 @@ public class GlobalRegistrationsImpl implements GlobalRegistrations {
genericGeneratorRegistrations.put( generatorRegistration.getName(), generatorRegistration ); genericGeneratorRegistrations.put( generatorRegistration.getName(), generatorRegistration );
} }
// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
// Converters
public void collectConverter(ClassDetails converterClassDetails) {
if ( jpaConverters == null ) {
jpaConverters = new HashSet<>();
}
jpaConverters.add( new ConverterRegistration( converterClassDetails, null ) );
}
public void collectConverters(List<JaxbConverterImpl> converters) {
if ( CollectionHelper.isEmpty( converters ) ) {
return;
}
if ( jpaConverters == null ) {
jpaConverters = CollectionHelper.setOfSize( converters.size() );
}
converters.forEach( (jaxbConverter) -> {
final String converterClassName = jaxbConverter.getClazz();
assert converterClassName != null;
final ClassDetails converterType = classDetailsRegistry.resolveClassDetails( converterClassName );
final boolean autoApply = jaxbConverter.isAutoApply();
jpaConverters.add( new ConverterRegistration( converterType, autoApply ) );
} );
}
} }

View File

@ -11,6 +11,7 @@ import java.util.ArrayList;
import java.util.List; import java.util.List;
import java.util.Locale; import java.util.Locale;
import org.hibernate.AnnotationException;
import org.hibernate.annotations.Cache; import org.hibernate.annotations.Cache;
import org.hibernate.annotations.NaturalId; import org.hibernate.annotations.NaturalId;
import org.hibernate.annotations.NaturalIdCache; import org.hibernate.annotations.NaturalIdCache;
@ -109,6 +110,10 @@ public class HierarchyMetadataCollector implements HierarchyTypeConsumer {
} }
private KeyMapping buildIdMapping() { private KeyMapping buildIdMapping() {
if ( collectedIdAttributes == null ) {
throw new AnnotationException( "Unable to determine id attribute(s) - " + rootEntityClassDetails.getName() );
}
if ( collectedIdAttributes instanceof List ) { if ( collectedIdAttributes instanceof List ) {
//noinspection unchecked //noinspection unchecked
final List<AttributeMetadata> idAttributes = (List<AttributeMetadata>) collectedIdAttributes; final List<AttributeMetadata> idAttributes = (List<AttributeMetadata>) collectedIdAttributes;
@ -132,6 +137,18 @@ public class HierarchyMetadataCollector implements HierarchyTypeConsumer {
return new AggregatedKeyMappingImpl( idAttribute ); return new AggregatedKeyMappingImpl( idAttribute );
} }
if ( idAttribute.getNature() == AttributeMetadata.AttributeNature.TO_ONE ) {
final List<AttributeMetadata> idAttributes = List.of( idAttribute );
final ClassDetails idClassDetails;
if ( idClassAnnotation == null ) {
idClassDetails = null;
}
else {
idClassDetails = idClassAnnotation.getAttributeValue( "value" );
}
return new NonAggregatedKeyMappingImpl( idAttributes, idClassDetails );
}
throw new ModelsException( throw new ModelsException(
String.format( String.format(
Locale.ROOT, Locale.ROOT,
@ -163,6 +180,10 @@ public class HierarchyMetadataCollector implements HierarchyTypeConsumer {
return new AggregatedKeyMappingImpl( attribute ); return new AggregatedKeyMappingImpl( attribute );
} }
if ( attribute.getNature() == AttributeMetadata.AttributeNature.TO_ONE ) {
return new BasicKeyMappingImpl( attribute );
}
throw new ModelsException( throw new ModelsException(
String.format( String.format(
Locale.ROOT, Locale.ROOT,

View File

@ -1,14 +0,0 @@
/*
* Hibernate, Relational Persistence for Idiomatic Java
*
* SPDX-License-Identifier: Apache-2.0
* Copyright: Red Hat Inc. and Hibernate Authors
*/
package org.hibernate.boot.models.categorize.internal;
/**
* @author Steve Ebersole
*/
public class HierarchyTypeHandling {
}

View File

@ -28,22 +28,35 @@ public class MappedSuperclassTypeMetadataImpl
private final List<JpaEventListener> hierarchyEventListeners; private final List<JpaEventListener> hierarchyEventListeners;
private final List<JpaEventListener> completeEventListeners; private final List<JpaEventListener> completeEventListeners;
/**
* Form used when the mapped-superclass is the absolute-root of the hierarchy ("above" the root entity)
*/
public MappedSuperclassTypeMetadataImpl( public MappedSuperclassTypeMetadataImpl(
ClassDetails classDetails, ClassDetails classDetails,
EntityHierarchy hierarchy, EntityHierarchy hierarchy,
MappedSuperclassTypeMetadataImpl superTypeMetadata,
AccessType defaultAccessType, AccessType defaultAccessType,
HierarchyTypeConsumer typeConsumer, HierarchyTypeConsumer typeConsumer,
ModelCategorizationContext modelContext) { ModelCategorizationContext modelContext) {
super( classDetails, hierarchy, defaultAccessType, modelContext ); super( classDetails, hierarchy, superTypeMetadata, defaultAccessType, modelContext );
final LifecycleCallbackCollector lifecycleCallbackCollector = new LifecycleCallbackCollector( classDetails, modelContext ); final LifecycleCallbackCollector lifecycleCallbackCollector = new LifecycleCallbackCollector( classDetails, modelContext );
this.attributeList = resolveAttributes( lifecycleCallbackCollector ); this.attributeList = resolveAttributes( lifecycleCallbackCollector );
this.hierarchyEventListeners = collectHierarchyEventListeners( lifecycleCallbackCollector.resolve() ); this.hierarchyEventListeners = collectHierarchyEventListeners( lifecycleCallbackCollector.resolve() );
this.completeEventListeners = collectCompleteEventListeners( modelContext ); this.completeEventListeners = collectCompleteEventListeners( modelContext );
postInstantiate( typeConsumer ); if ( superTypeMetadata != null ) {
superTypeMetadata.addSubclass( this );
}
postInstantiate( false, typeConsumer );
} }
/**
* Form used when the mapped-superclass is NOT the absolute-root of the hierarchy
*/
public MappedSuperclassTypeMetadataImpl( public MappedSuperclassTypeMetadataImpl(
ClassDetails classDetails, ClassDetails classDetails,
EntityHierarchy hierarchy, EntityHierarchy hierarchy,
@ -57,7 +70,7 @@ public class MappedSuperclassTypeMetadataImpl
this.hierarchyEventListeners = collectHierarchyEventListeners( lifecycleCallbackCollector.resolve() ); this.hierarchyEventListeners = collectHierarchyEventListeners( lifecycleCallbackCollector.resolve() );
this.completeEventListeners = collectCompleteEventListeners( modelContext ); this.completeEventListeners = collectCompleteEventListeners( modelContext );
postInstantiate( typeConsumer ); postInstantiate( true, typeConsumer );
} }
@Override @Override

View File

@ -9,20 +9,56 @@ package org.hibernate.boot.models.categorize.internal;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.LinkedHashMap; import java.util.LinkedHashMap;
import java.util.List; import java.util.List;
import java.util.Locale;
import java.util.function.BiConsumer; import java.util.function.BiConsumer;
import java.util.function.Function; import java.util.function.Function;
import org.hibernate.annotations.Any;
import org.hibernate.annotations.AnyDiscriminator;
import org.hibernate.annotations.AnyDiscriminatorValue;
import org.hibernate.annotations.AnyDiscriminatorValues;
import org.hibernate.annotations.AnyKeyJavaClass;
import org.hibernate.annotations.AnyKeyJavaType;
import org.hibernate.annotations.AnyKeyJdbcType;
import org.hibernate.annotations.AnyKeyJdbcTypeCode;
import org.hibernate.annotations.JavaType;
import org.hibernate.annotations.JdbcType;
import org.hibernate.annotations.JdbcTypeCode;
import org.hibernate.annotations.ManyToAny;
import org.hibernate.annotations.Nationalized;
import org.hibernate.annotations.TenantId;
import org.hibernate.annotations.TimeZoneColumn;
import org.hibernate.annotations.TimeZoneStorage;
import org.hibernate.annotations.Type;
import org.hibernate.boot.internal.AnyKeyType;
import org.hibernate.boot.models.AccessTypePlacementException; import org.hibernate.boot.models.AccessTypePlacementException;
import org.hibernate.boot.models.AnnotationPlacementException;
import org.hibernate.boot.models.JpaAnnotations; import org.hibernate.boot.models.JpaAnnotations;
import org.hibernate.boot.models.categorize.spi.ModelCategorizationContext; import org.hibernate.boot.models.categorize.spi.ClassAttributeAccessType;
import org.hibernate.models.spi.AnnotationTarget;
import org.hibernate.models.spi.AnnotationUsage; import org.hibernate.models.spi.AnnotationUsage;
import org.hibernate.models.spi.ClassDetails; import org.hibernate.models.spi.ClassDetails;
import org.hibernate.models.spi.FieldDetails; import org.hibernate.models.spi.FieldDetails;
import org.hibernate.models.spi.MemberDetails; import org.hibernate.models.spi.MemberDetails;
import org.hibernate.models.spi.MethodDetails; import org.hibernate.models.spi.MethodDetails;
import jakarta.annotation.Generated;
import jakarta.persistence.Access; import jakarta.persistence.Access;
import jakarta.persistence.AccessType; import jakarta.persistence.AccessType;
import jakarta.persistence.Basic;
import jakarta.persistence.Column;
import jakarta.persistence.ElementCollection;
import jakarta.persistence.Embedded;
import jakarta.persistence.EmbeddedId;
import jakarta.persistence.Enumerated;
import jakarta.persistence.Id;
import jakarta.persistence.Lob;
import jakarta.persistence.ManyToMany;
import jakarta.persistence.ManyToOne;
import jakarta.persistence.OneToMany;
import jakarta.persistence.OneToOne;
import jakarta.persistence.Temporal;
import jakarta.persistence.Version;
/** /**
* Standard implementation of the PersistentAttributeMemberResolver contract * Standard implementation of the PersistentAttributeMemberResolver contract
@ -41,16 +77,15 @@ public class StandardPersistentAttributeMemberResolver extends AbstractPersisten
Function<FieldDetails,Boolean> transientFieldChecker, Function<FieldDetails,Boolean> transientFieldChecker,
Function<MethodDetails,Boolean> transientMethodChecker, Function<MethodDetails,Boolean> transientMethodChecker,
ClassDetails classDetails, ClassDetails classDetails,
AccessType classLevelAccessType) { ClassAttributeAccessType classLevelAccessType) {
assert classLevelAccessType != null;
final LinkedHashMap<String,MemberDetails> results = new LinkedHashMap<>(); final LinkedHashMap<String,MemberDetails> results = new LinkedHashMap<>();
processAttributeLevelAccess( processAttributeLevelAccess(
results::put, results::put,
transientFieldChecker, transientFieldChecker,
transientMethodChecker, transientMethodChecker,
classDetails classDetails,
classLevelAccessType
); );
processClassLevelAccess( processClassLevelAccess(
@ -69,17 +104,18 @@ public class StandardPersistentAttributeMemberResolver extends AbstractPersisten
BiConsumer<String,MemberDetails> memberConsumer, BiConsumer<String,MemberDetails> memberConsumer,
Function<FieldDetails,Boolean> transientFieldChecker, Function<FieldDetails,Boolean> transientFieldChecker,
Function<MethodDetails,Boolean> transientMethodChecker, Function<MethodDetails,Boolean> transientMethodChecker,
ClassDetails classDetails) { ClassDetails classDetails,
ClassAttributeAccessType classLevelAccessType) {
final List<FieldDetails> fields = classDetails.getFields(); final List<FieldDetails> fields = classDetails.getFields();
for ( int i = 0; i < fields.size(); i++ ) { for ( int i = 0; i < fields.size(); i++ ) {
final FieldDetails fieldDetails = fields.get( i ); final FieldDetails fieldDetails = fields.get( i );
processAttributeLevelAccessMember( fieldDetails, memberConsumer, transientFieldChecker, classDetails ); processAttributeLevelAccessMember( fieldDetails, memberConsumer, transientFieldChecker, classDetails, classLevelAccessType );
} }
final List<MethodDetails> methods = classDetails.getMethods(); final List<MethodDetails> methods = classDetails.getMethods();
for ( int i = 0; i < methods.size(); i++ ) { for ( int i = 0; i < methods.size(); i++ ) {
final MethodDetails methodDetails = methods.get( i ); final MethodDetails methodDetails = methods.get( i );
processAttributeLevelAccessMember( methodDetails, memberConsumer, transientMethodChecker, classDetails ); processAttributeLevelAccessMember( methodDetails, memberConsumer, transientMethodChecker, classDetails, classLevelAccessType );
} }
} }
@ -87,22 +123,115 @@ public class StandardPersistentAttributeMemberResolver extends AbstractPersisten
M memberDetails, M memberDetails,
BiConsumer<String,MemberDetails> memberConsumer, BiConsumer<String,MemberDetails> memberConsumer,
Function<M,Boolean> transiencyChecker, Function<M,Boolean> transiencyChecker,
ClassDetails classDetails) { ClassDetails classDetails,
ClassAttributeAccessType classLevelAccessType) {
if ( transiencyChecker.apply( memberDetails ) ) {
// the field is transient
return;
}
final AnnotationUsage<Access> access = memberDetails.getAnnotationUsage( JpaAnnotations.ACCESS ); final AnnotationUsage<Access> access = memberDetails.getAnnotationUsage( JpaAnnotations.ACCESS );
if ( access == null ) { if ( access == null ) {
checkForMisplacedAnnotations( classDetails, memberDetails, classLevelAccessType );
return; return;
} }
final AccessType attributeAccessType = access.getAttributeValue( "value" ); final AccessType attributeAccessType = access.getAttributeValue( "value" );
validateAttributeLevelAccess( memberDetails, attributeAccessType, classDetails ); validateAttributeLevelAccess( memberDetails, attributeAccessType, classDetails );
if ( transiencyChecker.apply( memberDetails ) ) { memberConsumer.accept( memberDetails.resolveAttributeName(), memberDetails );
// the field is @Transient }
private <M extends MemberDetails> void checkForMisplacedAnnotations(
ClassDetails classDetails,
M memberDetails,
ClassAttributeAccessType classLevelAccessType) {
// We have a case where the member did not define `@Access`.
//
// In such a case the member would only be an attribute backer if the member
// kind matched the class access-type. If the member kind does *not* match
// the class access-type, validate that it does not declare any mapping annotations
if ( classLevelAccessType == null ) {
// nothing to check
return; return;
} }
memberConsumer.accept( memberDetails.resolveAttributeName(), memberDetails ); if ( !matchesAccessType( memberDetails, classLevelAccessType ) ) {
if ( containsMappingAnnotations( memberDetails ) ) {
if ( memberDetails.getKind() == AnnotationTarget.Kind.FIELD ) {
throw new AnnotationPlacementException(
String.format(
Locale.ROOT,
"Field `%s#%s` declared mapping annotations even though it is not a persistent attribute",
classDetails.getName(),
memberDetails.getName()
)
);
}
else {
assert memberDetails.getKind() == AnnotationTarget.Kind.METHOD;
throw new AnnotationPlacementException(
String.format(
Locale.ROOT,
"Method `%s#%s` declared mapping annotations even though it is not a persistent attribute",
classDetails.getName(),
memberDetails.getName()
)
);
}
}
}
}
private <M extends MemberDetails> boolean matchesAccessType(
M memberDetails,
ClassAttributeAccessType classLevelAccessType) {
assert classLevelAccessType != null;
if ( classLevelAccessType.getJpaAccessType() == AccessType.FIELD ) {
return memberDetails.getKind() == AnnotationTarget.Kind.FIELD;
}
else {
return memberDetails.getKind() == AnnotationTarget.Kind.METHOD
&& ( (MethodDetails) memberDetails ).getMethodKind() == MethodDetails.MethodKind.GETTER;
}
}
private <M extends MemberDetails> boolean containsMappingAnnotations(M memberDetails) {
// todo (jpa32) : better way to do this?
return memberDetails.hasAnnotationUsage( Id.class )
|| memberDetails.hasAnnotationUsage( EmbeddedId.class )
|| memberDetails.hasAnnotationUsage( Version.class )
|| memberDetails.hasAnnotationUsage( Basic.class )
|| memberDetails.hasAnnotationUsage( Embedded.class )
|| memberDetails.hasAnnotationUsage( ManyToOne.class )
|| memberDetails.hasAnnotationUsage( OneToOne.class )
|| memberDetails.hasAnnotationUsage( ElementCollection.class )
|| memberDetails.hasAnnotationUsage( ManyToMany.class )
|| memberDetails.hasAnnotationUsage( OneToMany.class )
|| memberDetails.hasAnnotationUsage( Any.class )
|| memberDetails.hasAnnotationUsage( ManyToAny.class )
|| memberDetails.hasAnnotationUsage( AnyKeyJavaClass.class )
|| memberDetails.hasAnnotationUsage( AnyKeyJavaType.class )
|| memberDetails.hasAnnotationUsage( AnyKeyJdbcType.class )
|| memberDetails.hasAnnotationUsage( AnyKeyJdbcTypeCode.class )
|| memberDetails.hasAnnotationUsage( AnyKeyType.class )
|| memberDetails.hasAnnotationUsage( AnyDiscriminator.class )
|| memberDetails.hasAnnotationUsage( AnyDiscriminatorValue.class )
|| memberDetails.hasAnnotationUsage( AnyDiscriminatorValues.class )
|| memberDetails.hasAnnotationUsage( Column.class )
|| memberDetails.hasAnnotationUsage( Enumerated.class )
|| memberDetails.hasAnnotationUsage( Lob.class )
|| memberDetails.hasAnnotationUsage( Temporal.class )
|| memberDetails.hasAnnotationUsage( Nationalized.class )
|| memberDetails.hasAnnotationUsage( TenantId.class )
|| memberDetails.hasAnnotationUsage( Generated.class )
|| memberDetails.hasAnnotationUsage( TimeZoneColumn.class )
|| memberDetails.hasAnnotationUsage( TimeZoneStorage.class )
|| memberDetails.hasAnnotationUsage( Type.class )
|| memberDetails.hasAnnotationUsage( JavaType.class )
|| memberDetails.hasAnnotationUsage( JdbcType.class )
|| memberDetails.hasAnnotationUsage( JdbcTypeCode.class );
} }
private void validateAttributeLevelAccess( private void validateAttributeLevelAccess(
@ -115,20 +244,34 @@ public class StandardPersistentAttributeMemberResolver extends AbstractPersisten
// 1. specify @Access(FIELD) on a getter // 1. specify @Access(FIELD) on a getter
// 2. specify @Access(PROPERTY) on a field // 2. specify @Access(PROPERTY) on a field
// todo (jpa32) : pass along access to JpaCompliance and use a new `JpaCompliance#isAnnotationPlacementComplianceEnabled` method here
// - for now, just allow it as we interpret the actual attribute AccessType value to dictate the state access
if ( !isAnnotationPlacementComplianceEnabled() ) {
return;
}
if ( ( attributeAccessType == AccessType.FIELD && !annotationTarget.isField() ) if ( ( attributeAccessType == AccessType.FIELD && !annotationTarget.isField() )
|| ( attributeAccessType == AccessType.PROPERTY && annotationTarget.isField() ) ) { || ( attributeAccessType == AccessType.PROPERTY && annotationTarget.isField() ) ) {
throw new AccessTypePlacementException( classDetails, annotationTarget ); throw new AccessTypePlacementException( classDetails, annotationTarget );
} }
} }
private boolean isAnnotationPlacementComplianceEnabled() {
return false;
}
private void processClassLevelAccess( private void processClassLevelAccess(
Function<String,Boolean> alreadyProcessedChecker, Function<String,Boolean> alreadyProcessedChecker,
BiConsumer<String, MemberDetails> memberConsumer, BiConsumer<String, MemberDetails> memberConsumer,
Function<FieldDetails,Boolean> transientFieldChecker, Function<FieldDetails,Boolean> transientFieldChecker,
Function<MethodDetails,Boolean> transientMethodChecker, Function<MethodDetails,Boolean> transientMethodChecker,
ClassDetails classDetails, ClassDetails classDetails,
AccessType classLevelAccessType) { ClassAttributeAccessType classLevelAccessType) {
if ( classLevelAccessType == AccessType.FIELD ) { if ( classLevelAccessType == null ) {
return;
}
if ( classLevelAccessType.getJpaAccessType() == AccessType.FIELD ) {
final List<FieldDetails> fields = classDetails.getFields(); final List<FieldDetails> fields = classDetails.getFields();
for ( int i = 0; i < fields.size(); i++ ) { for ( int i = 0; i < fields.size(); i++ ) {
final FieldDetails fieldDetails = fields.get( i ); final FieldDetails fieldDetails = fields.get( i );
@ -151,7 +294,7 @@ public class StandardPersistentAttributeMemberResolver extends AbstractPersisten
} }
} }
else { else {
assert classLevelAccessType == AccessType.PROPERTY; assert classLevelAccessType.getJpaAccessType() == AccessType.PROPERTY;
final List<MethodDetails> methods = classDetails.getMethods(); final List<MethodDetails> methods = classDetails.getMethods();
for ( int i = 0; i < methods.size(); i++ ) { for ( int i = 0; i < methods.size(); i++ ) {
final MethodDetails methodDetails = methods.get( i ); final MethodDetails methodDetails = methods.get( i );

View File

@ -32,12 +32,17 @@ public interface AttributeMetadata extends TableOwner {
/** /**
* An enum defining the nature (categorization) of a persistent attribute. * An enum defining the nature (categorization) of a persistent attribute.
*
* @see jakarta.persistence.metamodel.Attribute.PersistentAttributeType
*/ */
enum AttributeNature { enum AttributeNature {
BASIC, BASIC,
EMBEDDED, EMBEDDED,
ANY, ANY,
TO_ONE, TO_ONE,
PLURAL ELEMENT_COLLECTION,
MANY_TO_ANY,
MANY_TO_MANY,
ONE_TO_MANY
} }
} }

View File

@ -9,12 +9,15 @@ package org.hibernate.boot.models.categorize.spi;
import java.util.Map; import java.util.Map;
import java.util.Set; import java.util.Set;
import org.hibernate.boot.models.xml.spi.PersistenceUnitMetadata;
import org.hibernate.internal.util.IndexedConsumer; import org.hibernate.internal.util.IndexedConsumer;
import org.hibernate.internal.util.KeyedConsumer; import org.hibernate.internal.util.KeyedConsumer;
import org.hibernate.models.spi.AnnotationDescriptorRegistry; import org.hibernate.models.spi.AnnotationDescriptorRegistry;
import org.hibernate.models.spi.ClassDetails; import org.hibernate.models.spi.ClassDetails;
import org.hibernate.models.spi.ClassDetailsRegistry; import org.hibernate.models.spi.ClassDetailsRegistry;
import org.jboss.jandex.IndexView;
/** /**
* The application's domain model, understood at a very rudimentary level - we know * The application's domain model, understood at a very rudimentary level - we know
* a class is an entity, a mapped-superclass, ... And we know about persistent attributes, * a class is an entity, a mapped-superclass, ... And we know about persistent attributes,
@ -36,6 +39,15 @@ public interface CategorizedDomainModel {
*/ */
AnnotationDescriptorRegistry getAnnotationDescriptorRegistry(); AnnotationDescriptorRegistry getAnnotationDescriptorRegistry();
IndexView getJandexIndex();
PersistenceUnitMetadata getPersistenceUnitMetadata();
/**
* Global registrations collected while processing the persistence-unit.
*/
GlobalRegistrations getGlobalRegistrations();
/** /**
* All entity hierarchies defined in the persistence unit * All entity hierarchies defined in the persistence unit
*/ */
@ -91,9 +103,4 @@ public interface CategorizedDomainModel {
embeddables.forEach( consumer::accept ); embeddables.forEach( consumer::accept );
} }
/**
* Global registrations collected while processing the persistence-unit.
*/
GlobalRegistrations getGlobalRegistrations();
} }

View File

@ -0,0 +1,58 @@
/*
* Hibernate, Relational Persistence for Idiomatic Java
*
* License: GNU Lesser General Public License (LGPL), version 2.1 or later.
* See the lgpl.txt file in the root directory or http://www.gnu.org/licenses/lgpl-2.1.html.
*/
package org.hibernate.boot.models.categorize.spi;
import jakarta.persistence.AccessType;
/**
* Possible class-level {@linkplain jakarta.persistence.AccessType} values.
*
* @author Steve Ebersole
*/
public enum ClassAttributeAccessType {
/**
* The class explicitly defined field access via {@linkplain jakarta.persistence.Access}
*/
EXPLICIT_FIELD(true, AccessType.FIELD),
/**
* The class explicitly defined property access via {@linkplain jakarta.persistence.Access}
*/
EXPLICIT_PROPERTY(true, AccessType.PROPERTY),
/**
* The class implicitly defined field access.
*/
IMPLICIT_FIELD(false, AccessType.FIELD),
/**
* The class implicitly defined property access.
*/
IMPLICIT_PROPERTY(false, AccessType.PROPERTY);
private final boolean explicit;
private final AccessType jpaAccessType;
ClassAttributeAccessType(boolean explicit, AccessType jpaAccessType) {
this.explicit = explicit;
this.jpaAccessType = jpaAccessType;
}
/**
* Whether the access-type was explicitly specified
*/
public boolean isExplicit() {
return explicit;
}
/**
* The corresponding {@linkplain jakarta.persistence.AccessType}
*/
public AccessType getJpaAccessType() {
return jpaAccessType;
}
}

View File

@ -0,0 +1,33 @@
/*
* Hibernate, Relational Persistence for Idiomatic Java
*
* License: GNU Lesser General Public License (LGPL), version 2.1 or later.
* See the lgpl.txt file in the root directory or http://www.gnu.org/licenses/lgpl-2.1.html.
*/
package org.hibernate.boot.models.categorize.spi;
import java.util.Objects;
import org.hibernate.models.spi.ClassDetails;
/**
* @author Steve Ebersole
*/
public record ConverterRegistration(ClassDetails converterClass, Boolean autoApply) {
@Override
public boolean equals(Object o) {
if ( this == o ) {
return true;
}
if ( o == null || getClass() != o.getClass() ) {
return false;
}
ConverterRegistration that = (ConverterRegistration) o;
return Objects.equals( converterClass, that.converterClass );
}
@Override
public int hashCode() {
return Objects.hash( converterClass );
}
}

View File

@ -8,6 +8,7 @@ package org.hibernate.boot.models.categorize.spi;
import org.hibernate.engine.OptimisticLockStyle; import org.hibernate.engine.OptimisticLockStyle;
import jakarta.persistence.AccessType;
import jakarta.persistence.InheritanceType; import jakarta.persistence.InheritanceType;
/** /**
@ -33,6 +34,12 @@ public interface EntityHierarchy {
*/ */
void forEachType(HierarchyTypeVisitor typeVisitor); void forEachType(HierarchyTypeVisitor typeVisitor);
/**
* The default access-type for the hierarchy. See section <i>2.3.1 Default Access Type</i>
* of the Jakarta Persistence specification.
*/
AccessType getDefaultAccessType();
/** /**
* The inheritance strategy for the hierarchy. * The inheritance strategy for the hierarchy.
*/ */

View File

@ -6,6 +6,8 @@
*/ */
package org.hibernate.boot.models.categorize.spi; package org.hibernate.boot.models.categorize.spi;
import java.util.Map;
import org.hibernate.boot.model.CustomSql; import org.hibernate.boot.model.CustomSql;
import org.hibernate.boot.model.naming.EntityNaming; import org.hibernate.boot.model.naming.EntityNaming;
@ -81,15 +83,15 @@ public interface EntityTypeMetadata extends IdentifiableTypeMetadata, EntityNami
/** /**
* Custom SQL to perform an INSERT of this entity * Custom SQL to perform an INSERT of this entity
*/ */
CustomSql getCustomInsert(); Map<String, CustomSql> getCustomInserts();
/** /**
* Custom SQL to perform an UPDATE of this entity * Custom SQL to perform an UPDATE of this entity
*/ */
CustomSql getCustomUpdate(); Map<String, CustomSql> getCustomUpdates();
/** /**
* Custom SQL to perform an DELETE of this entity * Custom SQL to perform an DELETE of this entity
*/ */
CustomSql getCustomDelete(); Map<String, CustomSql> getCustomDeletes();
} }

View File

@ -8,6 +8,7 @@ package org.hibernate.boot.models.categorize.spi;
import java.util.List; import java.util.List;
import java.util.Map; import java.util.Map;
import java.util.Set;
/** /**
@ -35,12 +36,16 @@ public interface GlobalRegistrations {
Map<String, FilterDefRegistration> getFilterDefRegistrations(); Map<String, FilterDefRegistration> getFilterDefRegistrations();
Map<String, String> getImportedRenames();
Map<String, SequenceGeneratorRegistration> getSequenceGeneratorRegistrations(); Map<String, SequenceGeneratorRegistration> getSequenceGeneratorRegistrations();
Map<String, TableGeneratorRegistration> getTableGeneratorRegistrations(); Map<String, TableGeneratorRegistration> getTableGeneratorRegistrations();
Map<String, GenericGeneratorRegistration> getGenericGeneratorRegistrations(); Map<String, GenericGeneratorRegistration> getGenericGeneratorRegistrations();
Set<ConverterRegistration> getJpaConverters();
// todo : named entity graphs // todo : named entity graphs
// todo : named queries // todo : named queries
} }

View File

@ -29,7 +29,7 @@ import jakarta.persistence.PreUpdate;
* *
* Represents a global entity listener defined in the persistence unit * Represents a global entity listener defined in the persistence unit
* *
* @see JaxbPersistenceUnitDefaultsImpl#getEntityListeners() * @see JaxbPersistenceUnitDefaultsImpl#getEntityListenerContainer()
* @see JaxbEntityListenerImpl * @see JaxbEntityListenerImpl
* @see GlobalRegistrations#getEntityListenerRegistrations() * @see GlobalRegistrations#getEntityListenerRegistrations()
* *
@ -109,9 +109,9 @@ public class JpaEventListener {
} }
/** /**
* Create a listener descriptor from XML (with explicitly named methods) * Create a listener descriptor from XML
* *
* @see JaxbPersistenceUnitDefaultsImpl#getEntityListeners() * @see JaxbPersistenceUnitDefaultsImpl#getEntityListenerContainer()
* @see JaxbEntityListenerImpl * @see JaxbEntityListenerImpl
* @see GlobalRegistrations#getEntityListenerRegistrations() * @see GlobalRegistrations#getEntityListenerRegistrations()
*/ */
@ -127,13 +127,17 @@ public class JpaEventListener {
final MutableObject<MethodDetails> postUpdateMethod = new MutableObject<>(); final MutableObject<MethodDetails> postUpdateMethod = new MutableObject<>();
final MutableObject<MethodDetails> postLoadMethod = new MutableObject<>(); final MutableObject<MethodDetails> postLoadMethod = new MutableObject<>();
if ( isImplicitMethodMappings( jaxbMapping ) ) {
return from( consumerType, listenerClassDetails );
}
listenerClassDetails.forEachMethod( (index, methodDetails) -> { listenerClassDetails.forEachMethod( (index, methodDetails) -> {
if ( jaxbMapping.getPrePersist() != null if ( jaxbMapping.getPrePersist() != null
&& methodDetails.getName().equals( jaxbMapping.getPrePersist().getMethodName() ) && methodDetails.getName().equals( jaxbMapping.getPrePersist().getMethodName() )
&& matchesSignature( consumerType, methodDetails ) ) { && matchesSignature( consumerType, methodDetails ) ) {
prePersistMethod.set( methodDetails ); prePersistMethod.set( methodDetails );
} }
else if ( jaxbMapping.getPostPersist().getMethodName() != null else if ( jaxbMapping.getPostPersist() != null
&& methodDetails.getName().equals( jaxbMapping.getPostPersist().getMethodName() ) && methodDetails.getName().equals( jaxbMapping.getPostPersist().getMethodName() )
&& matchesSignature( consumerType, methodDetails ) ) { && matchesSignature( consumerType, methodDetails ) ) {
postPersistMethod.set( methodDetails ); postPersistMethod.set( methodDetails );
@ -182,6 +186,16 @@ public class JpaEventListener {
return jpaEventListener; return jpaEventListener;
} }
private static boolean isImplicitMethodMappings(JaxbEntityListenerImpl jaxbMapping) {
return jaxbMapping.getPrePersist() == null
&& jaxbMapping.getPreUpdate() == null
&& jaxbMapping.getPreRemove() == null
&& jaxbMapping.getPostLoad() == null
&& jaxbMapping.getPostPersist() == null
&& jaxbMapping.getPostUpdate() == null
&& jaxbMapping.getPostRemove() == null;
}
private static void errorIfEmpty(JpaEventListener jpaEventListener) { private static void errorIfEmpty(JpaEventListener jpaEventListener) {
if ( jpaEventListener.prePersistMethod == null if ( jpaEventListener.prePersistMethod == null
&& jpaEventListener.postPersistMethod == null && jpaEventListener.postPersistMethod == null
@ -194,6 +208,12 @@ public class JpaEventListener {
} }
} }
/**
* Create a listener descriptor from annotations
*
* @see jakarta.persistence.EntityListeners
* @see GlobalRegistrations#getEntityListenerRegistrations()
*/
public static JpaEventListener from(JpaEventListenerStyle consumerType, ClassDetails listenerClassDetails) { public static JpaEventListener from(JpaEventListenerStyle consumerType, ClassDetails listenerClassDetails) {
final MutableObject<MethodDetails> prePersistMethod = new MutableObject<>(); final MutableObject<MethodDetails> prePersistMethod = new MutableObject<>();
final MutableObject<MethodDetails> postPersistMethod = new MutableObject<>(); final MutableObject<MethodDetails> postPersistMethod = new MutableObject<>();

View File

@ -10,6 +10,7 @@ import java.util.HashMap;
import java.util.List; import java.util.List;
import java.util.Map; import java.util.Map;
import java.util.Set; import java.util.Set;
import java.util.stream.Collectors;
import org.hibernate.boot.model.process.spi.ManagedResources; import org.hibernate.boot.model.process.spi.ManagedResources;
import org.hibernate.boot.models.categorize.ModelCategorizationLogging; import org.hibernate.boot.models.categorize.ModelCategorizationLogging;
@ -17,10 +18,10 @@ import org.hibernate.boot.models.categorize.internal.ClassLoaderServiceLoading;
import org.hibernate.boot.models.categorize.internal.DomainModelCategorizationCollector; import org.hibernate.boot.models.categorize.internal.DomainModelCategorizationCollector;
import org.hibernate.boot.models.categorize.internal.ModelCategorizationContextImpl; import org.hibernate.boot.models.categorize.internal.ModelCategorizationContextImpl;
import org.hibernate.boot.models.categorize.internal.OrmAnnotationHelper; import org.hibernate.boot.models.categorize.internal.OrmAnnotationHelper;
import org.hibernate.boot.models.categorize.xml.spi.XmlPreProcessingResult; import org.hibernate.boot.models.xml.spi.XmlPreProcessingResult;
import org.hibernate.boot.models.categorize.xml.spi.XmlPreProcessor; import org.hibernate.boot.models.xml.spi.XmlPreProcessor;
import org.hibernate.boot.models.categorize.xml.spi.XmlProcessingResult; import org.hibernate.boot.models.xml.spi.XmlProcessingResult;
import org.hibernate.boot.models.categorize.xml.spi.XmlProcessor; import org.hibernate.boot.models.xml.spi.XmlProcessor;
import org.hibernate.boot.registry.classloading.spi.ClassLoaderService; import org.hibernate.boot.registry.classloading.spi.ClassLoaderService;
import org.hibernate.boot.registry.classloading.spi.ClassLoadingException; import org.hibernate.boot.registry.classloading.spi.ClassLoadingException;
import org.hibernate.boot.spi.BootstrapContext; import org.hibernate.boot.spi.BootstrapContext;
@ -41,7 +42,7 @@ import org.jboss.jandex.IndexView;
import org.jboss.jandex.Indexer; import org.jboss.jandex.Indexer;
import static org.hibernate.boot.models.categorize.internal.EntityHierarchyBuilder.createEntityHierarchies; import static org.hibernate.boot.models.categorize.internal.EntityHierarchyBuilder.createEntityHierarchies;
import static org.hibernate.models.internal.util.CollectionHelper.mutableJoin; import static org.hibernate.internal.util.collections.CollectionHelper.mutableJoin;
/** /**
* Processes a {@linkplain ManagedResources} (classes, mapping, etc.) and * Processes a {@linkplain ManagedResources} (classes, mapping, etc.) and
@ -75,7 +76,9 @@ public class ManagedResourcesProcessor {
final XmlPreProcessingResult xmlPreProcessingResult = XmlPreProcessor.preProcessXmlResources( managedResources ); final XmlPreProcessingResult xmlPreProcessingResult = XmlPreProcessor.preProcessXmlResources( managedResources );
//noinspection unchecked
final List<String> allKnownClassNames = mutableJoin( final List<String> allKnownClassNames = mutableJoin(
managedResources.getAnnotatedClassReferences().stream().map( Class::getName ).collect( Collectors.toList() ),
managedResources.getAnnotatedClassNames(), managedResources.getAnnotatedClassNames(),
xmlPreProcessingResult.getMappedClasses() xmlPreProcessingResult.getMappedClasses()
); );
@ -118,22 +121,23 @@ public class ManagedResourcesProcessor {
// JPA id generator global-ity thing // JPA id generator global-ity thing
final boolean areIdGeneratorsGlobal = true; final boolean areIdGeneratorsGlobal = true;
final ClassDetailsRegistry mutableClassDetailsRegistry = sourceModelBuildingContext.getClassDetailsRegistry(); final ClassDetailsRegistry classDetailsRegistry = sourceModelBuildingContext.getClassDetailsRegistry();
final AnnotationDescriptorRegistry descriptorRegistry = sourceModelBuildingContext.getAnnotationDescriptorRegistry(); final AnnotationDescriptorRegistry descriptorRegistry = sourceModelBuildingContext.getAnnotationDescriptorRegistry();
final DomainModelCategorizationCollector modelCategorizationCollector = new DomainModelCategorizationCollector( final DomainModelCategorizationCollector modelCategorizationCollector = new DomainModelCategorizationCollector(
areIdGeneratorsGlobal, areIdGeneratorsGlobal,
mutableClassDetailsRegistry, classDetailsRegistry,
descriptorRegistry descriptorRegistry,
jandexIndex
); );
final XmlProcessingResult xmlProcessingResult = XmlProcessor.processXml( xmlPreProcessingResult, modelCategorizationCollector, sourceModelBuildingContext ); final XmlProcessingResult xmlProcessingResult = XmlProcessor.processXml( xmlPreProcessingResult, modelCategorizationCollector, sourceModelBuildingContext );
allKnownClassNames.forEach( (className) -> { allKnownClassNames.forEach( (className) -> {
final ClassDetails classDetails = mutableClassDetailsRegistry.resolveClassDetails( className ); final ClassDetails classDetails = classDetailsRegistry.resolveClassDetails( className );
modelCategorizationCollector.apply( classDetails ); modelCategorizationCollector.apply( classDetails );
} ); } );
xmlPreProcessingResult.getMappedNames().forEach( (className) -> { xmlPreProcessingResult.getMappedNames().forEach( (className) -> {
final ClassDetails classDetails = mutableClassDetailsRegistry.resolveClassDetails( className ); final ClassDetails classDetails = classDetailsRegistry.resolveClassDetails( className );
modelCategorizationCollector.apply( classDetails ); modelCategorizationCollector.apply( classDetails );
} ); } );
@ -152,7 +156,7 @@ public class ManagedResourcesProcessor {
// OUTPUTS: // OUTPUTS:
// - CategorizedDomainModel // - CategorizedDomainModel
final ClassDetailsRegistry classDetailsRegistryImmutable = mutableClassDetailsRegistry final ClassDetailsRegistry classDetailsRegistryImmutable = classDetailsRegistry
.makeImmutableCopy(); .makeImmutableCopy();
final AnnotationDescriptorRegistry annotationDescriptorRegistryImmutable = descriptorRegistry final AnnotationDescriptorRegistry annotationDescriptorRegistryImmutable = descriptorRegistry
@ -187,7 +191,12 @@ public class ManagedResourcesProcessor {
); );
} }
return modelCategorizationCollector.createResult( entityHierarchies, classDetailsRegistryImmutable, annotationDescriptorRegistryImmutable ); return modelCategorizationCollector.createResult(
entityHierarchies,
xmlPreProcessingResult.getPersistenceUnitMetadata(),
classDetailsRegistryImmutable,
annotationDescriptorRegistryImmutable
);
} }
private static void ignore(IdentifiableTypeMetadata identifiableTypeMetadata) { private static void ignore(IdentifiableTypeMetadata identifiableTypeMetadata) {

View File

@ -32,7 +32,7 @@ public interface ManagedTypeMetadata {
/** /**
* The class-level access type * The class-level access type
*/ */
AccessType getAccessType(); ClassAttributeAccessType getClassLevelAccessType();
/** /**
* Get the number of declared attributes * Get the number of declared attributes

View File

@ -38,7 +38,7 @@ public interface PersistentAttributeMemberResolver {
*/ */
List<MemberDetails> resolveAttributesMembers( List<MemberDetails> resolveAttributesMembers(
ClassDetails classDetails, ClassDetails classDetails,
AccessType classLevelAccessType, ClassAttributeAccessType classLevelAccessType,
AllMemberConsumer allMemberConsumer); AllMemberConsumer allMemberConsumer);
} }

View File

@ -1,29 +0,0 @@
/*
* Hibernate, Relational Persistence for Idiomatic Java
*
* SPDX-License-Identifier: Apache-2.0
* Copyright: Red Hat Inc. and Hibernate Authors
*/
package org.hibernate.boot.models.categorize.xml.internal.attr;
import org.hibernate.boot.jaxb.mapping.spi.JaxbManyToManyImpl;
import org.hibernate.boot.models.categorize.xml.spi.XmlDocumentContext;
import org.hibernate.models.internal.MutableClassDetails;
import org.hibernate.models.internal.MutableMemberDetails;
import jakarta.persistence.AccessType;
/**
* @author Steve Ebersole
*/
public class ManyToManyAttributeProcessing {
@SuppressWarnings("UnusedReturnValue")
public static MutableMemberDetails processManyToManyAttribute(
JaxbManyToManyImpl jaxbManyToMany,
MutableClassDetails mutableClassDetails,
AccessType classAccessType,
XmlDocumentContext xmlDocumentContext) {
throw new UnsupportedOperationException( "Support for many-to-many attributes not yet implemented" );
}
}

View File

@ -1,29 +0,0 @@
/*
* Hibernate, Relational Persistence for Idiomatic Java
*
* SPDX-License-Identifier: Apache-2.0
* Copyright: Red Hat Inc. and Hibernate Authors
*/
package org.hibernate.boot.models.categorize.xml.internal.attr;
import org.hibernate.boot.jaxb.mapping.spi.JaxbOneToOneImpl;
import org.hibernate.boot.models.categorize.xml.spi.XmlDocumentContext;
import org.hibernate.models.internal.MutableClassDetails;
import org.hibernate.models.internal.MutableMemberDetails;
import jakarta.persistence.AccessType;
/**
* @author Steve Ebersole
*/
public class OneToOneAttributeProcessing {
@SuppressWarnings("UnusedReturnValue")
public static MutableMemberDetails processOneToOneAttribute(
JaxbOneToOneImpl jaxbOneToOne,
MutableClassDetails mutableClassDetails,
AccessType classAccessType,
XmlDocumentContext xmlDocumentContext) {
throw new UnsupportedOperationException( "Support for one-to-one attributes not yet implemented" );
}
}

View File

@ -1,21 +0,0 @@
/*
* Hibernate, Relational Persistence for Idiomatic Java
*
* SPDX-License-Identifier: Apache-2.0
* Copyright: Red Hat Inc. and Hibernate Authors
*/
package org.hibernate.boot.models.categorize.xml.spi;
import org.hibernate.models.spi.SourceModelBuildingContext;
/**
* Context to a specific XML mapping file
* @author Steve Ebersole
*/
public interface XmlDocumentContext {
XmlDocument getXmlDocument();
PersistenceUnitMetadata getPersistenceUnitMetadata();
SourceModelBuildingContext getModelBuildingContext();
}

View File

@ -0,0 +1,21 @@
/*
* Hibernate, Relational Persistence for Idiomatic Java
*
* License: GNU Lesser General Public License (LGPL), version 2.1 or later.
* See the lgpl.txt file in the root directory or http://www.gnu.org/licenses/lgpl-2.1.html.
*/
package org.hibernate.boot.models.xml;
import org.hibernate.Internal;
import org.jboss.logging.Logger;
/**
* @author Steve Ebersole
*/
@Internal
public interface XmlProcessLogging {
String NAME = "org.hibernate.models.xml";
Logger XML_PROCESS_LOGGER = Logger.getLogger( NAME );
}

View File

@ -1,10 +1,10 @@
/* /*
* Hibernate, Relational Persistence for Idiomatic Java * Hibernate, Relational Persistence for Idiomatic Java
* *
* SPDX-License-Identifier: Apache-2.0 * License: GNU Lesser General Public License (LGPL), version 2.1 or later.
* Copyright: Red Hat Inc. and Hibernate Authors * See the lgpl.txt file in the root directory or http://www.gnu.org/licenses/lgpl-2.1.html.
*/ */
package org.hibernate.boot.models.categorize.xml; package org.hibernate.boot.models.xml;
/** /**
* Generally indicates a problem locating or table an XML resource * Generally indicates a problem locating or table an XML resource

View File

@ -1,10 +1,10 @@
/* /*
* Hibernate, Relational Persistence for Idiomatic Java * Hibernate, Relational Persistence for Idiomatic Java
* *
* SPDX-License-Identifier: Apache-2.0 * License: GNU Lesser General Public License (LGPL), version 2.1 or later.
* Copyright: Red Hat Inc. and Hibernate Authors * See the lgpl.txt file in the root directory or http://www.gnu.org/licenses/lgpl-2.1.html.
*/ */
package org.hibernate.boot.models.categorize.xml.internal; package org.hibernate.boot.models.xml.internal;
import org.hibernate.boot.jaxb.mapping.spi.JaxbAnyMappingImpl; import org.hibernate.boot.jaxb.mapping.spi.JaxbAnyMappingImpl;
import org.hibernate.boot.jaxb.mapping.spi.JaxbAttributesContainer; import org.hibernate.boot.jaxb.mapping.spi.JaxbAttributesContainer;
@ -19,16 +19,16 @@ import org.hibernate.boot.jaxb.mapping.spi.JaxbOneToManyImpl;
import org.hibernate.boot.jaxb.mapping.spi.JaxbOneToOneImpl; import org.hibernate.boot.jaxb.mapping.spi.JaxbOneToOneImpl;
import org.hibernate.boot.jaxb.mapping.spi.JaxbPersistentAttribute; import org.hibernate.boot.jaxb.mapping.spi.JaxbPersistentAttribute;
import org.hibernate.boot.jaxb.mapping.spi.JaxbPluralAnyMappingImpl; import org.hibernate.boot.jaxb.mapping.spi.JaxbPluralAnyMappingImpl;
import org.hibernate.boot.models.categorize.xml.internal.attr.AnyMappingAttributeProcessing; import org.hibernate.boot.models.xml.internal.attr.AnyMappingAttributeProcessing;
import org.hibernate.boot.models.categorize.xml.internal.attr.BasicAttributeProcessing; import org.hibernate.boot.models.xml.internal.attr.BasicAttributeProcessing;
import org.hibernate.boot.models.categorize.xml.internal.attr.ElementCollectionAttributeProcessing; import org.hibernate.boot.models.xml.internal.attr.ElementCollectionAttributeProcessing;
import org.hibernate.boot.models.categorize.xml.internal.attr.EmbeddedAttributeProcessing; import org.hibernate.boot.models.xml.internal.attr.EmbeddedAttributeProcessing;
import org.hibernate.boot.models.categorize.xml.internal.attr.ManyToManyAttributeProcessing; import org.hibernate.boot.models.xml.internal.attr.ManyToManyAttributeProcessing;
import org.hibernate.boot.models.categorize.xml.internal.attr.ManyToOneAttributeProcessing; import org.hibernate.boot.models.xml.internal.attr.ManyToOneAttributeProcessing;
import org.hibernate.boot.models.categorize.xml.internal.attr.OneToManyAttributeProcessing; import org.hibernate.boot.models.xml.internal.attr.OneToManyAttributeProcessing;
import org.hibernate.boot.models.categorize.xml.internal.attr.OneToOneAttributeProcessing; import org.hibernate.boot.models.xml.internal.attr.OneToOneAttributeProcessing;
import org.hibernate.boot.models.categorize.xml.internal.attr.PluralAnyMappingAttributeProcessing; import org.hibernate.boot.models.xml.internal.attr.PluralAnyMappingAttributeProcessing;
import org.hibernate.boot.models.categorize.xml.spi.XmlDocumentContext; import org.hibernate.boot.models.xml.spi.XmlDocumentContext;
import org.hibernate.models.internal.MutableClassDetails; import org.hibernate.models.internal.MutableClassDetails;
import org.hibernate.models.internal.MutableMemberDetails; import org.hibernate.models.internal.MutableMemberDetails;

View File

@ -1,16 +1,17 @@
/* /*
* Hibernate, Relational Persistence for Idiomatic Java * Hibernate, Relational Persistence for Idiomatic Java
* *
* SPDX-License-Identifier: Apache-2.0 * License: GNU Lesser General Public License (LGPL), version 2.1 or later.
* Copyright: Red Hat Inc. and Hibernate Authors * See the lgpl.txt file in the root directory or http://www.gnu.org/licenses/lgpl-2.1.html.
*/ */
package org.hibernate.boot.models.categorize.xml.internal; package org.hibernate.boot.models.xml.internal;
import java.lang.reflect.Modifier; import java.lang.reflect.Modifier;
import java.util.Collection; import java.util.Collection;
import java.util.List; import java.util.List;
import java.util.Map; import java.util.Map;
import java.util.Set; import java.util.Set;
import java.util.function.Supplier;
import org.hibernate.annotations.SQLDelete; import org.hibernate.annotations.SQLDelete;
import org.hibernate.annotations.SQLInsert; import org.hibernate.annotations.SQLInsert;
@ -38,12 +39,12 @@ import org.hibernate.boot.jaxb.mapping.spi.JaxbPersistentAttribute;
import org.hibernate.boot.jaxb.mapping.spi.JaxbPluralAttribute; import org.hibernate.boot.jaxb.mapping.spi.JaxbPluralAttribute;
import org.hibernate.boot.jaxb.mapping.spi.JaxbTenantIdImpl; import org.hibernate.boot.jaxb.mapping.spi.JaxbTenantIdImpl;
import org.hibernate.boot.models.categorize.spi.JpaEventListenerStyle; import org.hibernate.boot.models.categorize.spi.JpaEventListenerStyle;
import org.hibernate.boot.models.categorize.xml.internal.attr.BasicAttributeProcessing; import org.hibernate.boot.models.xml.internal.attr.BasicAttributeProcessing;
import org.hibernate.boot.models.categorize.xml.internal.attr.BasicIdAttributeProcessing; import org.hibernate.boot.models.xml.internal.attr.BasicIdAttributeProcessing;
import org.hibernate.boot.models.categorize.xml.internal.attr.CommonAttributeProcessing; import org.hibernate.boot.models.xml.internal.attr.CommonAttributeProcessing;
import org.hibernate.boot.models.categorize.xml.internal.attr.EmbeddedIdAttributeProcessing; import org.hibernate.boot.models.xml.internal.attr.EmbeddedIdAttributeProcessing;
import org.hibernate.boot.models.categorize.xml.spi.XmlDocumentContext; import org.hibernate.boot.models.xml.spi.XmlDocumentContext;
import org.hibernate.boot.models.categorize.xml.spi.XmlProcessingResult; import org.hibernate.boot.models.xml.spi.XmlProcessingResult;
import org.hibernate.internal.util.StringHelper; import org.hibernate.internal.util.StringHelper;
import org.hibernate.internal.util.collections.CollectionHelper; import org.hibernate.internal.util.collections.CollectionHelper;
import org.hibernate.models.ModelsException; import org.hibernate.models.ModelsException;
@ -53,15 +54,22 @@ import org.hibernate.models.internal.MutableClassDetails;
import org.hibernate.models.internal.MutableMemberDetails; import org.hibernate.models.internal.MutableMemberDetails;
import org.hibernate.models.internal.dynamic.DynamicClassDetails; import org.hibernate.models.internal.dynamic.DynamicClassDetails;
import org.hibernate.models.internal.dynamic.MapModeFieldDetails; import org.hibernate.models.internal.dynamic.MapModeFieldDetails;
import org.hibernate.models.spi.AnnotationUsage;
import org.hibernate.models.spi.ClassDetails; import org.hibernate.models.spi.ClassDetails;
import org.hibernate.models.spi.ClassDetailsRegistry; import org.hibernate.models.spi.ClassDetailsRegistry;
import org.hibernate.models.spi.FieldDetails;
import org.hibernate.models.spi.MethodDetails;
import org.hibernate.property.access.spi.BuiltInPropertyAccessStrategies; import org.hibernate.property.access.spi.BuiltInPropertyAccessStrategies;
import jakarta.persistence.Access;
import jakarta.persistence.AccessType; import jakarta.persistence.AccessType;
import jakarta.persistence.Embeddable; import jakarta.persistence.Embeddable;
import jakarta.persistence.EmbeddedId;
import jakarta.persistence.Id;
import jakarta.persistence.MappedSuperclass; import jakarta.persistence.MappedSuperclass;
import static org.hibernate.internal.util.NullnessHelper.coalesce; import static org.hibernate.internal.util.NullnessHelper.coalesce;
import static org.hibernate.internal.util.NullnessHelper.coalesceSuppliedValues;
import static org.hibernate.internal.util.NullnessHelper.nullif; import static org.hibernate.internal.util.NullnessHelper.nullif;
/** /**
@ -115,7 +123,9 @@ public class ManagedTypeProcessor {
classDetails = (MutableClassDetails) classDetailsRegistry.resolveClassDetails( className ); classDetails = (MutableClassDetails) classDetailsRegistry.resolveClassDetails( className );
classAccessType = coalesce( classAccessType = coalesce(
jaxbEntity.getAccess(), jaxbEntity.getAccess(),
xmlDocumentContext.getPersistenceUnitMetadata().getAccessType() jaxbRoot.getAccess(),
xmlDocumentContext.getPersistenceUnitMetadata().getAccessType(),
AccessType.PROPERTY
); );
} }
@ -338,7 +348,7 @@ public class ManagedTypeProcessor {
final ClassDetailsRegistry classDetailsRegistry = xmlDocumentContext.getModelBuildingContext().getClassDetailsRegistry(); final ClassDetailsRegistry classDetailsRegistry = xmlDocumentContext.getModelBuildingContext().getClassDetailsRegistry();
if ( jaxbPersistentAttribute instanceof JaxbIdImpl jaxbId ) { if ( jaxbPersistentAttribute instanceof JaxbIdImpl jaxbId ) {
return XmlAnnotationHelper.resolveJavaType( jaxbId.getTarget(), xmlDocumentContext ); return xmlDocumentContext.resolveJavaType( jaxbId.getTarget() );
} }
if ( jaxbPersistentAttribute instanceof JaxbEmbeddedIdImpl jaxbEmbeddedId ) { if ( jaxbPersistentAttribute instanceof JaxbEmbeddedIdImpl jaxbEmbeddedId ) {
@ -353,7 +363,7 @@ public class ManagedTypeProcessor {
} }
if ( jaxbPersistentAttribute instanceof JaxbBasicImpl jaxbBasic ) { if ( jaxbPersistentAttribute instanceof JaxbBasicImpl jaxbBasic ) {
return XmlAnnotationHelper.resolveJavaType( jaxbBasic.getTarget(), xmlDocumentContext ); return xmlDocumentContext.resolveJavaType( jaxbBasic.getTarget() );
} }
if ( jaxbPersistentAttribute instanceof JaxbEmbeddedImpl jaxbEmbedded ) { if ( jaxbPersistentAttribute instanceof JaxbEmbeddedImpl jaxbEmbedded ) {
@ -436,27 +446,29 @@ public class ManagedTypeProcessor {
} }
final JaxbAttributesContainerImpl attributes = jaxbEntity.getAttributes(); final JaxbAttributesContainerImpl attributes = jaxbEntity.getAttributes();
processIdMappings( if ( attributes != null ) {
attributes, processIdMappings(
classAccessType, attributes,
classDetails, classAccessType,
memberAdjuster, classDetails,
xmlDocumentContext memberAdjuster,
); xmlDocumentContext
AttributeProcessor.processNaturalId( );
attributes.getNaturalId(), AttributeProcessor.processNaturalId(
classDetails, attributes.getNaturalId(),
classAccessType, classDetails,
memberAdjuster, classAccessType,
xmlDocumentContext memberAdjuster,
); xmlDocumentContext
AttributeProcessor.processAttributes( );
attributes, AttributeProcessor.processAttributes(
classDetails, attributes,
classAccessType, classDetails,
memberAdjuster, classAccessType,
xmlDocumentContext memberAdjuster,
); xmlDocumentContext
);
}
jaxbEntity.getFilters().forEach( jaxbFilter -> XmlAnnotationHelper.applyFilter( jaxbEntity.getFilters().forEach( jaxbFilter -> XmlAnnotationHelper.applyFilter(
jaxbFilter, jaxbFilter,
@ -551,9 +563,12 @@ public class ManagedTypeProcessor {
.getClassDetailsRegistry() .getClassDetailsRegistry()
.resolveClassDetails( className ); .resolveClassDetails( className );
final AccessType classAccessType = coalesce( final AccessType classAccessType = coalesceSuppliedValues(
jaxbEntity.getAccess(), jaxbEntity::getAccess,
xmlDocumentContext.getPersistenceUnitMetadata().getAccessType() jaxbRoot::getAccess,
() -> determineAccessTypeFromClassAnnotations( classDetails ),
xmlDocumentContext.getPersistenceUnitMetadata()::getAccessType,
() -> AccessType.PROPERTY
); );
// from here, processing is the same between override and metadata-complete modes // from here, processing is the same between override and metadata-complete modes
@ -569,6 +584,41 @@ public class ManagedTypeProcessor {
} }
private static AccessType determineAccessTypeFromClassAnnotations(ClassDetails classDetails) {
final AnnotationUsage<Access> accessUsage = classDetails.getAnnotationUsage( Access.class );
if ( accessUsage != null ) {
return accessUsage.getAttributeValue( "value" );
}
for ( FieldDetails field : classDetails.getFields() ) {
if ( field.getAnnotationUsage( Id.class ) != null
|| field.getAnnotationUsage( EmbeddedId.class ) != null ) {
return AccessType.FIELD;
}
}
for ( MethodDetails method : classDetails.getMethods() ) {
if ( method.getAnnotationUsage( Id.class ) != null
|| method.getAnnotationUsage( EmbeddedId.class ) != null ) {
assert method.getMethodKind() == MethodDetails.MethodKind.GETTER;
return AccessType.PROPERTY;
}
}
return null;
}
/**
* Used in cases where neither the class nor the XML defined an explicit AccessType.
* </p>
* According to the specification, strictly speaking, this should (could) be an exception
*/
private static Supplier<AccessType> determineAccessTypeFromClassAndXml(
JaxbEntityImpl jaxbEntity,
MutableClassDetails classDetails) {
return null;
}
private static void processIdMappings( private static void processIdMappings(
JaxbAttributesContainerImpl attributes, JaxbAttributesContainerImpl attributes,
AccessType classAccessType, AccessType classAccessType,

View File

@ -1,21 +1,21 @@
/* /*
* Hibernate, Relational Persistence for Idiomatic Java * Hibernate, Relational Persistence for Idiomatic Java
* *
* SPDX-License-Identifier: Apache-2.0 * License: GNU Lesser General Public License (LGPL), version 2.1 or later.
* Copyright: Red Hat Inc. and Hibernate Authors * See the lgpl.txt file in the root directory or http://www.gnu.org/licenses/lgpl-2.1.html.
*/ */
package org.hibernate.boot.models.categorize.xml.internal; package org.hibernate.boot.models.xml.internal;
import java.util.EnumSet; import java.util.EnumSet;
import org.hibernate.annotations.CascadeType; import org.hibernate.annotations.CascadeType;
import org.hibernate.boot.jaxb.mapping.spi.JaxbPersistenceUnitDefaultsImpl; import org.hibernate.boot.jaxb.mapping.spi.JaxbPersistenceUnitDefaultsImpl;
import org.hibernate.boot.jaxb.mapping.spi.JaxbPersistenceUnitMetadataImpl; import org.hibernate.boot.jaxb.mapping.spi.JaxbPersistenceUnitMetadataImpl;
import org.hibernate.boot.models.categorize.ModelCategorizationLogging; import org.hibernate.boot.models.xml.spi.PersistenceUnitMetadata;
import org.hibernate.boot.models.categorize.xml.spi.PersistenceUnitMetadata;
import jakarta.persistence.AccessType; import jakarta.persistence.AccessType;
import static org.hibernate.boot.models.xml.XmlProcessLogging.XML_PROCESS_LOGGER;
import static org.hibernate.internal.util.StringHelper.isNotEmpty; import static org.hibernate.internal.util.StringHelper.isNotEmpty;
import static org.hibernate.internal.util.StringHelper.splitTrimmingTokens; import static org.hibernate.internal.util.StringHelper.splitTrimmingTokens;
@ -88,7 +88,7 @@ public final class PersistenceUnitMetadataImpl implements PersistenceUnitMetadat
if ( isNotEmpty( defaults.getCatalog() ) ) { if ( isNotEmpty( defaults.getCatalog() ) ) {
if ( defaultCatalog != null ) { if ( defaultCatalog != null ) {
ModelCategorizationLogging.MODEL_CATEGORIZATION_LOGGER.debugf( XML_PROCESS_LOGGER.debugf(
"Setting already set default catalog : %s, %s", "Setting already set default catalog : %s, %s",
defaultCatalog, defaultCatalog,
defaults.getCatalog() defaults.getCatalog()
@ -99,7 +99,7 @@ public final class PersistenceUnitMetadataImpl implements PersistenceUnitMetadat
if ( isNotEmpty( defaults.getSchema() ) ) { if ( isNotEmpty( defaults.getSchema() ) ) {
if ( defaultSchema != null ) { if ( defaultSchema != null ) {
ModelCategorizationLogging.MODEL_CATEGORIZATION_LOGGER.debugf( XML_PROCESS_LOGGER.debugf(
"Setting already set default schema : %s, %s", "Setting already set default schema : %s, %s",
defaultSchema, defaultSchema,
defaults.getSchema() defaults.getSchema()
@ -110,7 +110,7 @@ public final class PersistenceUnitMetadataImpl implements PersistenceUnitMetadat
if ( defaults.getAccess() != null ) { if ( defaults.getAccess() != null ) {
if ( accessType != null ) { if ( accessType != null ) {
ModelCategorizationLogging.MODEL_CATEGORIZATION_LOGGER.debugf( XML_PROCESS_LOGGER.debugf(
"Overriding already set default AccessType : %s, %s", "Overriding already set default AccessType : %s, %s",
defaults.getAccess(), defaults.getAccess(),
accessType accessType
@ -121,7 +121,7 @@ public final class PersistenceUnitMetadataImpl implements PersistenceUnitMetadat
if ( isNotEmpty( defaults.getDefaultAccess() ) ) { if ( isNotEmpty( defaults.getDefaultAccess() ) ) {
if ( defaultAccessStrategy != null ) { if ( defaultAccessStrategy != null ) {
ModelCategorizationLogging.MODEL_CATEGORIZATION_LOGGER.debugf( XML_PROCESS_LOGGER.debugf(
"Overriding already set default access strategy : %s, %s", "Overriding already set default access strategy : %s, %s",
accessType, accessType,
defaultAccessStrategy defaultAccessStrategy
@ -133,7 +133,7 @@ public final class PersistenceUnitMetadataImpl implements PersistenceUnitMetadat
if ( defaults.getCascadePersist() != null if ( defaults.getCascadePersist() != null
|| isNotEmpty( defaults.getDefaultCascade() ) ) { || isNotEmpty( defaults.getDefaultCascade() ) ) {
if ( !defaultCascadeTypes.isEmpty() ) { if ( !defaultCascadeTypes.isEmpty() ) {
ModelCategorizationLogging.MODEL_CATEGORIZATION_LOGGER.debugf( "Adding cascades to already defined set of default cascades" ); XML_PROCESS_LOGGER.debugf( "Adding cascades to already defined set of default cascades" );
} }
if ( defaults.getCascadePersist() != null ) { if ( defaults.getCascadePersist() != null ) {

View File

@ -1,10 +1,10 @@
/* /*
* Hibernate, Relational Persistence for Idiomatic Java * Hibernate, Relational Persistence for Idiomatic Java
* *
* SPDX-License-Identifier: Apache-2.0 * License: GNU Lesser General Public License (LGPL), version 2.1 or later.
* Copyright: Red Hat Inc. and Hibernate Authors * See the lgpl.txt file in the root directory or http://www.gnu.org/licenses/lgpl-2.1.html.
*/ */
package org.hibernate.boot.models.categorize.xml.internal; package org.hibernate.boot.models.xml.internal;
import java.io.IOException; import java.io.IOException;
import java.io.InputStream; import java.io.InputStream;

View File

@ -1,10 +1,10 @@
/* /*
* Hibernate, Relational Persistence for Idiomatic Java * Hibernate, Relational Persistence for Idiomatic Java
* *
* SPDX-License-Identifier: Apache-2.0 * License: GNU Lesser General Public License (LGPL), version 2.1 or later.
* Copyright: Red Hat Inc. and Hibernate Authors * See the lgpl.txt file in the root directory or http://www.gnu.org/licenses/lgpl-2.1.html.
*/ */
package org.hibernate.boot.models.categorize.xml.internal; package org.hibernate.boot.models.xml.internal;
import java.lang.annotation.Annotation; import java.lang.annotation.Annotation;
import java.lang.reflect.Field; import java.lang.reflect.Field;
@ -87,8 +87,8 @@ import org.hibernate.boot.jaxb.mapping.spi.db.JaxbColumnJoined;
import org.hibernate.boot.jaxb.mapping.spi.db.JaxbTableMapping; import org.hibernate.boot.jaxb.mapping.spi.db.JaxbTableMapping;
import org.hibernate.boot.models.categorize.spi.JpaEventListener; import org.hibernate.boot.models.categorize.spi.JpaEventListener;
import org.hibernate.boot.models.categorize.spi.JpaEventListenerStyle; import org.hibernate.boot.models.categorize.spi.JpaEventListenerStyle;
import org.hibernate.boot.models.categorize.xml.internal.db.ColumnProcessing; import org.hibernate.boot.models.xml.internal.db.ColumnProcessing;
import org.hibernate.boot.models.categorize.xml.spi.XmlDocumentContext; import org.hibernate.boot.models.xml.spi.XmlDocumentContext;
import org.hibernate.engine.spi.ExecuteUpdateResultCheckStyle; import org.hibernate.engine.spi.ExecuteUpdateResultCheckStyle;
import org.hibernate.internal.util.KeyedConsumer; import org.hibernate.internal.util.KeyedConsumer;
import org.hibernate.internal.util.StringHelper; import org.hibernate.internal.util.StringHelper;
@ -846,7 +846,14 @@ public class XmlAnnotationHelper {
memberDetails.addAnnotationUsage( annotationUsage ); memberDetails.addAnnotationUsage( annotationUsage );
final ClassDetailsRegistry classDetailsRegistry = xmlDocumentContext.getModelBuildingContext().getClassDetailsRegistry(); final ClassDetailsRegistry classDetailsRegistry = xmlDocumentContext.getModelBuildingContext().getClassDetailsRegistry();
final ClassDetails converter = classDetailsRegistry.resolveClassDetails( jaxbConvert.getConverter() ); final ClassDetails converter;
if ( StringHelper.isNotEmpty( jaxbConvert.getConverter() ) ) {
converter = classDetailsRegistry.resolveClassDetails( jaxbConvert.getConverter() );
}
else {
// allowable for disable-conversion
converter = null;
}
annotationUsage.setAttributeValue( "converter", converter ); annotationUsage.setAttributeValue( "converter", converter );
annotationUsage.setAttributeValue( "attributeName", prefixIfNotAlready( jaxbConvert.getAttributeName(), namePrefix ) ); annotationUsage.setAttributeValue( "attributeName", prefixIfNotAlready( jaxbConvert.getAttributeName(), namePrefix ) );
annotationUsage.setAttributeValue( "disableConversion", jaxbConvert.isDisableConversion() ); annotationUsage.setAttributeValue( "disableConversion", jaxbConvert.isDisableConversion() );
@ -1005,7 +1012,11 @@ public class XmlAnnotationHelper {
} }
public static ClassDetails resolveJavaType(String value, XmlDocumentContext xmlDocumentContext) { public static ClassDetails resolveJavaType(String value, XmlDocumentContext xmlDocumentContext) {
return resolveJavaType( value, xmlDocumentContext.getModelBuildingContext() ); return resolveJavaType(
xmlDocumentContext.getXmlDocument().getDefaults().getPackage(),
value,
xmlDocumentContext.getModelBuildingContext().getClassDetailsRegistry()
);
} }
public static ClassDetails resolveJavaType(String value, SourceModelBuildingContext sourceModelBuildingContext) { public static ClassDetails resolveJavaType(String value, SourceModelBuildingContext sourceModelBuildingContext) {
@ -1013,56 +1024,63 @@ public class XmlAnnotationHelper {
} }
public static ClassDetails resolveJavaType(String value, ClassDetailsRegistry classDetailsRegistry) { public static ClassDetails resolveJavaType(String value, ClassDetailsRegistry classDetailsRegistry) {
if ( StringHelper.isEmpty( value ) ) { return resolveJavaType( null, value, classDetailsRegistry );
value = Object.class.getName(); }
public static ClassDetails resolveJavaType(String packageName, String name, ClassDetailsRegistry classDetailsRegistry) {
if ( StringHelper.isEmpty( name ) ) {
name = Object.class.getName();
} }
else if ( byte.class.getName().equals( value ) else if ( byte.class.getName().equals( name )
|| boolean.class.getName().equals( value ) || boolean.class.getName().equals( name )
|| short.class.getName().equals( value ) || short.class.getName().equals( name )
|| int.class.getName().equals( value ) || int.class.getName().equals( name )
|| long.class.getName().equals( value ) || long.class.getName().equals( name )
|| double.class.getName().equals( value ) || double.class.getName().equals( name )
|| float.class.getName().equals( value ) ) { || float.class.getName().equals( name ) ) {
// nothing to do for primitives // nothing to do for primitives
} }
else if ( Byte.class.getSimpleName().equalsIgnoreCase( value ) ) { else if ( Byte.class.getSimpleName().equalsIgnoreCase( name ) ) {
value = Byte.class.getName(); name = Byte.class.getName();
} }
else if ( Boolean.class.getSimpleName().equalsIgnoreCase( value ) ) { else if ( Boolean.class.getSimpleName().equalsIgnoreCase( name ) ) {
value = Boolean.class.getName(); name = Boolean.class.getName();
} }
else if ( Short.class.getSimpleName().equalsIgnoreCase( value ) ) { else if ( Short.class.getSimpleName().equalsIgnoreCase( name ) ) {
value = Short.class.getName(); name = Short.class.getName();
} }
else if ( Integer.class.getSimpleName().equalsIgnoreCase( value ) ) { else if ( Integer.class.getSimpleName().equalsIgnoreCase( name ) ) {
value = Integer.class.getName(); name = Integer.class.getName();
} }
else if ( Long.class.getSimpleName().equalsIgnoreCase( value ) ) { else if ( Long.class.getSimpleName().equalsIgnoreCase( name ) ) {
value = Long.class.getName(); name = Long.class.getName();
} }
else if ( Double.class.getSimpleName().equalsIgnoreCase( value ) ) { else if ( Double.class.getSimpleName().equalsIgnoreCase( name ) ) {
value = Double.class.getName(); name = Double.class.getName();
} }
else if ( Float.class.getSimpleName().equalsIgnoreCase( value ) ) { else if ( Float.class.getSimpleName().equalsIgnoreCase( name ) ) {
value = Float.class.getName(); name = Float.class.getName();
} }
else if ( BigInteger.class.getSimpleName().equalsIgnoreCase( value ) ) { else if ( BigInteger.class.getSimpleName().equalsIgnoreCase( name ) ) {
value = BigInteger.class.getName(); name = BigInteger.class.getName();
} }
else if ( BigDecimal.class.getSimpleName().equalsIgnoreCase( value ) ) { else if ( BigDecimal.class.getSimpleName().equalsIgnoreCase( name ) ) {
value = BigDecimal.class.getName(); name = BigDecimal.class.getName();
} }
else if ( String.class.getSimpleName().equalsIgnoreCase( value ) ) { else if ( String.class.getSimpleName().equalsIgnoreCase( name ) ) {
value = String.class.getName(); name = String.class.getName();
} }
else if ( Character.class.getSimpleName().equalsIgnoreCase( value ) ) { else if ( Character.class.getSimpleName().equalsIgnoreCase( name ) ) {
value = Character.class.getName(); name = Character.class.getName();
} }
else if ( UUID.class.getSimpleName().equalsIgnoreCase( value ) ) { else if ( UUID.class.getSimpleName().equalsIgnoreCase( name ) ) {
value = Character.class.getName(); name = Character.class.getName();
}
else {
name = StringHelper.qualifyConditionallyIfNot( packageName, name );
} }
return classDetailsRegistry.resolveClassDetails( value ); return classDetailsRegistry.resolveClassDetails( name );
} }
public static void applyBasicTypeComposition( public static void applyBasicTypeComposition(
@ -1277,8 +1295,7 @@ public class XmlAnnotationHelper {
classDetails, classDetails,
xmlDocumentContext xmlDocumentContext
); );
final MutableClassDetails entityListenerClass = (MutableClassDetails) xmlDocumentContext.getModelBuildingContext().getClassDetailsRegistry() final MutableClassDetails entityListenerClass = xmlDocumentContext.resolveJavaType( jaxbEntityListener.getClazz() );
.resolveClassDetails( jaxbEntityListener.getClazz() );
applyLifecycleCallbacks( applyLifecycleCallbacks(
jaxbEntityListener, jaxbEntityListener,
JpaEventListenerStyle.LISTENER, JpaEventListenerStyle.LISTENER,

View File

@ -1,14 +1,14 @@
/* /*
* Hibernate, Relational Persistence for Idiomatic Java * Hibernate, Relational Persistence for Idiomatic Java
* *
* SPDX-License-Identifier: Apache-2.0 * License: GNU Lesser General Public License (LGPL), version 2.1 or later.
* Copyright: Red Hat Inc. and Hibernate Authors * See the lgpl.txt file in the root directory or http://www.gnu.org/licenses/lgpl-2.1.html.
*/ */
package org.hibernate.boot.models.categorize.xml.internal; package org.hibernate.boot.models.xml.internal;
import org.hibernate.boot.models.categorize.xml.spi.PersistenceUnitMetadata; import org.hibernate.boot.models.xml.spi.PersistenceUnitMetadata;
import org.hibernate.boot.models.categorize.xml.spi.XmlDocument; import org.hibernate.boot.models.xml.spi.XmlDocument;
import org.hibernate.boot.models.categorize.xml.spi.XmlDocumentContext; import org.hibernate.boot.models.xml.spi.XmlDocumentContext;
import org.hibernate.models.spi.SourceModelBuildingContext; import org.hibernate.models.spi.SourceModelBuildingContext;
/** /**

View File

@ -1,10 +1,10 @@
/* /*
* Hibernate, Relational Persistence for Idiomatic Java * Hibernate, Relational Persistence for Idiomatic Java
* *
* SPDX-License-Identifier: Apache-2.0 * License: GNU Lesser General Public License (LGPL), version 2.1 or later.
* Copyright: Red Hat Inc. and Hibernate Authors * See the lgpl.txt file in the root directory or http://www.gnu.org/licenses/lgpl-2.1.html.
*/ */
package org.hibernate.boot.models.categorize.xml.internal; package org.hibernate.boot.models.xml.internal;
import java.util.Collections; import java.util.Collections;
import java.util.HashMap; import java.util.HashMap;
@ -28,8 +28,8 @@ import org.hibernate.boot.jaxb.mapping.spi.JaxbNamedNativeQueryImpl;
import org.hibernate.boot.jaxb.mapping.spi.JaxbNamedQueryImpl; import org.hibernate.boot.jaxb.mapping.spi.JaxbNamedQueryImpl;
import org.hibernate.boot.jaxb.mapping.spi.JaxbNamedStoredProcedureQueryImpl; import org.hibernate.boot.jaxb.mapping.spi.JaxbNamedStoredProcedureQueryImpl;
import org.hibernate.boot.jaxb.mapping.spi.JaxbUserTypeRegistrationImpl; import org.hibernate.boot.jaxb.mapping.spi.JaxbUserTypeRegistrationImpl;
import org.hibernate.boot.models.categorize.xml.spi.PersistenceUnitMetadata; import org.hibernate.boot.models.xml.spi.PersistenceUnitMetadata;
import org.hibernate.boot.models.categorize.xml.spi.XmlDocument; import org.hibernate.boot.models.xml.spi.XmlDocument;
import org.hibernate.internal.util.NullnessHelper; import org.hibernate.internal.util.NullnessHelper;
import jakarta.persistence.AccessType; import jakarta.persistence.AccessType;

View File

@ -1,16 +1,16 @@
/* /*
* Hibernate, Relational Persistence for Idiomatic Java * Hibernate, Relational Persistence for Idiomatic Java
* *
* SPDX-License-Identifier: Apache-2.0 * License: GNU Lesser General Public License (LGPL), version 2.1 or later.
* Copyright: Red Hat Inc. and Hibernate Authors * See the lgpl.txt file in the root directory or http://www.gnu.org/licenses/lgpl-2.1.html.
*/ */
package org.hibernate.boot.models.categorize.xml.internal; package org.hibernate.boot.models.xml.internal;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.List; import java.util.List;
import org.hibernate.boot.jaxb.mapping.spi.JaxbEntityMappingsImpl; import org.hibernate.boot.jaxb.mapping.spi.JaxbEntityMappingsImpl;
import org.hibernate.boot.models.categorize.xml.spi.XmlPreProcessingResult; import org.hibernate.boot.models.xml.spi.XmlPreProcessingResult;
import org.hibernate.internal.util.StringHelper; import org.hibernate.internal.util.StringHelper;
/** /**
@ -49,7 +49,7 @@ public class XmlPreProcessingResultImpl implements XmlPreProcessingResult {
if ( StringHelper.isNotEmpty( jaxbEmbeddable.getClazz() ) ) { if ( StringHelper.isNotEmpty( jaxbEmbeddable.getClazz() ) ) {
managedClasses.add( XmlProcessingHelper.determineClassName( document, jaxbEmbeddable ) ); managedClasses.add( XmlProcessingHelper.determineClassName( document, jaxbEmbeddable ) );
} }
if ( StringHelper.isNotEmpty( jaxbEmbeddable.getName() ) ) { else if ( StringHelper.isNotEmpty( jaxbEmbeddable.getName() ) ) {
managedNames.add( jaxbEmbeddable.getName() ); managedNames.add( jaxbEmbeddable.getName() );
} }
} ); } );
@ -60,7 +60,7 @@ public class XmlPreProcessingResultImpl implements XmlPreProcessingResult {
if ( StringHelper.isNotEmpty( jaxbEntity.getClazz() ) ) { if ( StringHelper.isNotEmpty( jaxbEntity.getClazz() ) ) {
managedClasses.add( XmlProcessingHelper.determineClassName( document, jaxbEntity ) ); managedClasses.add( XmlProcessingHelper.determineClassName( document, jaxbEntity ) );
} }
if ( StringHelper.isNotEmpty( jaxbEntity.getName() ) ) { else if ( StringHelper.isNotEmpty( jaxbEntity.getName() ) ) {
managedNames.add( jaxbEntity.getName() ); managedNames.add( jaxbEntity.getName() );
} }
} ); } );

View File

@ -1,10 +1,10 @@
/* /*
* Hibernate, Relational Persistence for Idiomatic Java * Hibernate, Relational Persistence for Idiomatic Java
* *
* SPDX-License-Identifier: Apache-2.0 * License: GNU Lesser General Public License (LGPL), version 2.1 or later.
* Copyright: Red Hat Inc. and Hibernate Authors * See the lgpl.txt file in the root directory or http://www.gnu.org/licenses/lgpl-2.1.html.
*/ */
package org.hibernate.boot.models.categorize.xml.internal; package org.hibernate.boot.models.xml.internal;
import java.beans.Introspector; import java.beans.Introspector;
import java.lang.annotation.Annotation; import java.lang.annotation.Annotation;
@ -12,7 +12,7 @@ import java.lang.annotation.Annotation;
import org.hibernate.boot.jaxb.mapping.spi.JaxbEntityMappingsImpl; import org.hibernate.boot.jaxb.mapping.spi.JaxbEntityMappingsImpl;
import org.hibernate.boot.jaxb.mapping.spi.JaxbManagedType; import org.hibernate.boot.jaxb.mapping.spi.JaxbManagedType;
import org.hibernate.boot.models.MemberResolutionException; import org.hibernate.boot.models.MemberResolutionException;
import org.hibernate.boot.models.categorize.xml.spi.XmlDocumentContext; import org.hibernate.boot.models.xml.spi.XmlDocumentContext;
import org.hibernate.internal.util.StringHelper; import org.hibernate.internal.util.StringHelper;
import org.hibernate.models.internal.MutableAnnotationTarget; import org.hibernate.models.internal.MutableAnnotationTarget;
import org.hibernate.models.internal.MutableAnnotationUsage; import org.hibernate.models.internal.MutableAnnotationUsage;
@ -38,12 +38,7 @@ public class XmlProcessingHelper {
* @param jaxbManagedType The class JAXB node * @param jaxbManagedType The class JAXB node
*/ */
public static String determineClassName(JaxbEntityMappingsImpl jaxbRoot, JaxbManagedType jaxbManagedType) { public static String determineClassName(JaxbEntityMappingsImpl jaxbRoot, JaxbManagedType jaxbManagedType) {
// if ( StringHelper.isQualified( jaxbManagedType.getClazz() ) ) { return StringHelper.qualifyConditionallyIfNot( jaxbRoot.getPackage(), jaxbManagedType.getClazz() );
if ( jaxbManagedType.getClazz().lastIndexOf( '.' ) > 0 ) {
return jaxbManagedType.getClazz();
}
return StringHelper.qualify( jaxbRoot.getPackage(), jaxbManagedType.getClazz() );
} }
public static AccessType inverse(AccessType accessType) { public static AccessType inverse(AccessType accessType) {
@ -102,8 +97,7 @@ public class XmlProcessingHelper {
} }
} }
} }
else { else if ( accessType == AccessType.FIELD ) {
assert accessType == AccessType.FIELD;
for ( int i = 0; i < classDetails.getFields().size(); i++ ) { for ( int i = 0; i < classDetails.getFields().size(); i++ ) {
final FieldDetails fieldDetails = classDetails.getFields().get( i ); final FieldDetails fieldDetails = classDetails.getFields().get( i );
if ( fieldDetails.getName().equals( attributeName ) ) { if ( fieldDetails.getName().equals( attributeName ) ) {

View File

@ -1,10 +1,10 @@
/* /*
* Hibernate, Relational Persistence for Idiomatic Java * Hibernate, Relational Persistence for Idiomatic Java
* *
* SPDX-License-Identifier: Apache-2.0 * License: GNU Lesser General Public License (LGPL), version 2.1 or later.
* Copyright: Red Hat Inc. and Hibernate Authors * See the lgpl.txt file in the root directory or http://www.gnu.org/licenses/lgpl-2.1.html.
*/ */
package org.hibernate.boot.models.categorize.xml.internal; package org.hibernate.boot.models.xml.internal;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.List; import java.util.List;
@ -12,8 +12,8 @@ import java.util.List;
import org.hibernate.boot.jaxb.mapping.spi.JaxbEmbeddableImpl; import org.hibernate.boot.jaxb.mapping.spi.JaxbEmbeddableImpl;
import org.hibernate.boot.jaxb.mapping.spi.JaxbEntityImpl; import org.hibernate.boot.jaxb.mapping.spi.JaxbEntityImpl;
import org.hibernate.boot.jaxb.mapping.spi.JaxbMappedSuperclassImpl; import org.hibernate.boot.jaxb.mapping.spi.JaxbMappedSuperclassImpl;
import org.hibernate.boot.models.categorize.xml.spi.PersistenceUnitMetadata; import org.hibernate.boot.models.xml.spi.PersistenceUnitMetadata;
import org.hibernate.boot.models.categorize.xml.spi.XmlProcessingResult; import org.hibernate.boot.models.xml.spi.XmlProcessingResult;
/** /**
* @author Steve Ebersole * @author Steve Ebersole

View File

@ -1,10 +1,10 @@
/* /*
* Hibernate, Relational Persistence for Idiomatic Java * Hibernate, Relational Persistence for Idiomatic Java
* *
* SPDX-License-Identifier: Apache-2.0 * License: GNU Lesser General Public License (LGPL), version 2.1 or later.
* Copyright: Red Hat Inc. and Hibernate Authors * See the lgpl.txt file in the root directory or http://www.gnu.org/licenses/lgpl-2.1.html.
*/ */
package org.hibernate.boot.models.categorize.xml.internal.attr; package org.hibernate.boot.models.xml.internal.attr;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.List; import java.util.List;
@ -19,9 +19,9 @@ import org.hibernate.boot.jaxb.mapping.spi.JaxbAnyMappingImpl;
import org.hibernate.boot.jaxb.mapping.spi.JaxbAnyMappingKeyImpl; import org.hibernate.boot.jaxb.mapping.spi.JaxbAnyMappingKeyImpl;
import org.hibernate.boot.jaxb.mapping.spi.JaxbColumnImpl; import org.hibernate.boot.jaxb.mapping.spi.JaxbColumnImpl;
import org.hibernate.boot.internal.AnyKeyType; import org.hibernate.boot.internal.AnyKeyType;
import org.hibernate.boot.models.categorize.xml.internal.XmlProcessingHelper; import org.hibernate.boot.models.xml.internal.XmlProcessingHelper;
import org.hibernate.boot.models.categorize.xml.internal.db.ColumnProcessing; import org.hibernate.boot.models.xml.internal.db.ColumnProcessing;
import org.hibernate.boot.models.categorize.xml.spi.XmlDocumentContext; import org.hibernate.boot.models.xml.spi.XmlDocumentContext;
import org.hibernate.internal.util.StringHelper; import org.hibernate.internal.util.StringHelper;
import org.hibernate.internal.util.collections.CollectionHelper; import org.hibernate.internal.util.collections.CollectionHelper;
import org.hibernate.models.internal.MutableAnnotationUsage; import org.hibernate.models.internal.MutableAnnotationUsage;

View File

@ -1,17 +1,17 @@
/* /*
* Hibernate, Relational Persistence for Idiomatic Java * Hibernate, Relational Persistence for Idiomatic Java
* *
* SPDX-License-Identifier: Apache-2.0 * License: GNU Lesser General Public License (LGPL), version 2.1 or later.
* Copyright: Red Hat Inc. and Hibernate Authors * See the lgpl.txt file in the root directory or http://www.gnu.org/licenses/lgpl-2.1.html.
*/ */
package org.hibernate.boot.models.categorize.xml.internal.attr; package org.hibernate.boot.models.xml.internal.attr;
import org.hibernate.annotations.Formula; import org.hibernate.annotations.Formula;
import org.hibernate.boot.jaxb.mapping.spi.JaxbBasicImpl; import org.hibernate.boot.jaxb.mapping.spi.JaxbBasicImpl;
import org.hibernate.boot.models.categorize.xml.internal.XmlAnnotationHelper; import org.hibernate.boot.models.xml.internal.XmlAnnotationHelper;
import org.hibernate.boot.models.categorize.xml.internal.XmlProcessingHelper; import org.hibernate.boot.models.xml.internal.XmlProcessingHelper;
import org.hibernate.boot.models.categorize.xml.internal.db.ColumnProcessing; import org.hibernate.boot.models.xml.internal.db.ColumnProcessing;
import org.hibernate.boot.models.categorize.xml.spi.XmlDocumentContext; import org.hibernate.boot.models.xml.spi.XmlDocumentContext;
import org.hibernate.internal.util.StringHelper; import org.hibernate.internal.util.StringHelper;
import org.hibernate.models.internal.MutableAnnotationUsage; import org.hibernate.models.internal.MutableAnnotationUsage;
import org.hibernate.models.internal.MutableClassDetails; import org.hibernate.models.internal.MutableClassDetails;

View File

@ -1,15 +1,15 @@
/* /*
* Hibernate, Relational Persistence for Idiomatic Java * Hibernate, Relational Persistence for Idiomatic Java
* *
* SPDX-License-Identifier: Apache-2.0 * License: GNU Lesser General Public License (LGPL), version 2.1 or later.
* Copyright: Red Hat Inc. and Hibernate Authors * See the lgpl.txt file in the root directory or http://www.gnu.org/licenses/lgpl-2.1.html.
*/ */
package org.hibernate.boot.models.categorize.xml.internal.attr; package org.hibernate.boot.models.xml.internal.attr;
import org.hibernate.boot.jaxb.mapping.spi.JaxbIdImpl; import org.hibernate.boot.jaxb.mapping.spi.JaxbIdImpl;
import org.hibernate.boot.models.categorize.xml.internal.XmlAnnotationHelper; import org.hibernate.boot.models.xml.internal.XmlAnnotationHelper;
import org.hibernate.boot.models.categorize.xml.internal.XmlProcessingHelper; import org.hibernate.boot.models.xml.internal.XmlProcessingHelper;
import org.hibernate.boot.models.categorize.xml.spi.XmlDocumentContext; import org.hibernate.boot.models.xml.spi.XmlDocumentContext;
import org.hibernate.models.internal.MutableAnnotationUsage; import org.hibernate.models.internal.MutableAnnotationUsage;
import org.hibernate.models.internal.MutableClassDetails; import org.hibernate.models.internal.MutableClassDetails;
import org.hibernate.models.internal.MutableMemberDetails; import org.hibernate.models.internal.MutableMemberDetails;

View File

@ -1,10 +1,10 @@
/* /*
* Hibernate, Relational Persistence for Idiomatic Java * Hibernate, Relational Persistence for Idiomatic Java
* *
* SPDX-License-Identifier: Apache-2.0 * License: GNU Lesser General Public License (LGPL), version 2.1 or later.
* Copyright: Red Hat Inc. and Hibernate Authors * See the lgpl.txt file in the root directory or http://www.gnu.org/licenses/lgpl-2.1.html.
*/ */
package org.hibernate.boot.models.categorize.xml.internal.attr; package org.hibernate.boot.models.xml.internal.attr;
import java.lang.annotation.Annotation; import java.lang.annotation.Annotation;
@ -18,8 +18,8 @@ import org.hibernate.boot.jaxb.mapping.spi.JaxbPersistentAttribute;
import org.hibernate.boot.jaxb.mapping.spi.JaxbSingularAssociationAttribute; import org.hibernate.boot.jaxb.mapping.spi.JaxbSingularAssociationAttribute;
import org.hibernate.boot.jaxb.mapping.spi.JaxbSingularFetchModeImpl; import org.hibernate.boot.jaxb.mapping.spi.JaxbSingularFetchModeImpl;
import org.hibernate.boot.jaxb.mapping.spi.JaxbStandardAttribute; import org.hibernate.boot.jaxb.mapping.spi.JaxbStandardAttribute;
import org.hibernate.boot.models.categorize.xml.internal.XmlProcessingHelper; import org.hibernate.boot.models.xml.internal.XmlProcessingHelper;
import org.hibernate.boot.models.categorize.xml.spi.XmlDocumentContext; import org.hibernate.boot.models.xml.spi.XmlDocumentContext;
import org.hibernate.models.internal.MutableAnnotationUsage; import org.hibernate.models.internal.MutableAnnotationUsage;
import org.hibernate.models.internal.MutableMemberDetails; import org.hibernate.models.internal.MutableMemberDetails;
import org.hibernate.models.spi.ClassDetails; import org.hibernate.models.spi.ClassDetails;

View File

@ -1,10 +1,10 @@
/* /*
* Hibernate, Relational Persistence for Idiomatic Java * Hibernate, Relational Persistence for Idiomatic Java
* *
* SPDX-License-Identifier: Apache-2.0 * License: GNU Lesser General Public License (LGPL), version 2.1 or later.
* Copyright: Red Hat Inc. and Hibernate Authors * See the lgpl.txt file in the root directory or http://www.gnu.org/licenses/lgpl-2.1.html.
*/ */
package org.hibernate.boot.models.categorize.xml.internal.attr; package org.hibernate.boot.models.xml.internal.attr;
import org.hibernate.annotations.Bag; import org.hibernate.annotations.Bag;
import org.hibernate.annotations.Fetch; import org.hibernate.annotations.Fetch;
@ -19,8 +19,9 @@ import org.hibernate.boot.internal.LimitedCollectionClassification;
import org.hibernate.boot.jaxb.mapping.spi.JaxbMapKeyImpl; import org.hibernate.boot.jaxb.mapping.spi.JaxbMapKeyImpl;
import org.hibernate.boot.jaxb.mapping.spi.JaxbOrderColumnImpl; import org.hibernate.boot.jaxb.mapping.spi.JaxbOrderColumnImpl;
import org.hibernate.boot.jaxb.mapping.spi.JaxbPluralAttribute; import org.hibernate.boot.jaxb.mapping.spi.JaxbPluralAttribute;
import org.hibernate.boot.models.categorize.xml.internal.XmlAnnotationHelper; import org.hibernate.boot.models.xml.internal.XmlAnnotationHelper;
import org.hibernate.boot.models.categorize.xml.spi.XmlDocumentContext; import org.hibernate.boot.models.xml.spi.XmlDocumentContext;
import org.hibernate.boot.models.xml.internal.XmlProcessingHelper;
import org.hibernate.internal.util.StringHelper; import org.hibernate.internal.util.StringHelper;
import org.hibernate.models.internal.MutableAnnotationUsage; import org.hibernate.models.internal.MutableAnnotationUsage;
import org.hibernate.models.internal.MutableMemberDetails; import org.hibernate.models.internal.MutableMemberDetails;
@ -36,8 +37,7 @@ import jakarta.persistence.MapKeyTemporal;
import jakarta.persistence.OrderBy; import jakarta.persistence.OrderBy;
import jakarta.persistence.OrderColumn; import jakarta.persistence.OrderColumn;
import static org.hibernate.boot.models.categorize.xml.internal.XmlAnnotationHelper.applyOr; import static org.hibernate.boot.models.xml.internal.XmlAnnotationHelper.applyOr;
import static org.hibernate.boot.models.categorize.xml.internal.XmlProcessingHelper.getOrMakeAnnotation;
/** /**
* @author Marco Belladelli * @author Marco Belladelli
@ -51,19 +51,19 @@ public class CommonPluralAttributeProcessing {
final ClassDetailsRegistry classDetailsRegistry = buildingContext.getClassDetailsRegistry(); final ClassDetailsRegistry classDetailsRegistry = buildingContext.getClassDetailsRegistry();
if ( jaxbPluralAttribute.getFetchMode() != null ) { if ( jaxbPluralAttribute.getFetchMode() != null ) {
final MutableAnnotationUsage<Fetch> fetchAnn = getOrMakeAnnotation( Fetch.class, memberDetails, xmlDocumentContext ); final MutableAnnotationUsage<Fetch> fetchAnn = XmlProcessingHelper.getOrMakeAnnotation( Fetch.class, memberDetails, xmlDocumentContext );
fetchAnn.setAttributeValue( "value", jaxbPluralAttribute.getFetchMode() ); fetchAnn.setAttributeValue( "value", jaxbPluralAttribute.getFetchMode() );
} }
if ( jaxbPluralAttribute.getClassification() != null ) { if ( jaxbPluralAttribute.getClassification() != null ) {
final MutableAnnotationUsage<CollectionClassification> collectionClassificationAnn = getOrMakeAnnotation( final MutableAnnotationUsage<CollectionClassification> collectionClassificationAnn = XmlProcessingHelper.getOrMakeAnnotation(
CollectionClassification.class, CollectionClassification.class,
memberDetails, memberDetails,
xmlDocumentContext xmlDocumentContext
); );
collectionClassificationAnn.setAttributeValue( "value", jaxbPluralAttribute.getClassification() ); collectionClassificationAnn.setAttributeValue( "value", jaxbPluralAttribute.getClassification() );
if ( jaxbPluralAttribute.getClassification() == LimitedCollectionClassification.BAG ) { if ( jaxbPluralAttribute.getClassification() == LimitedCollectionClassification.BAG ) {
getOrMakeAnnotation( Bag.class, memberDetails, xmlDocumentContext ); XmlProcessingHelper.getOrMakeAnnotation( Bag.class, memberDetails, xmlDocumentContext );
} }
} }
@ -75,7 +75,7 @@ public class CommonPluralAttributeProcessing {
XmlAnnotationHelper.applyCollectionId( jaxbPluralAttribute.getCollectionId(), memberDetails, xmlDocumentContext ); XmlAnnotationHelper.applyCollectionId( jaxbPluralAttribute.getCollectionId(), memberDetails, xmlDocumentContext );
if ( StringHelper.isNotEmpty( jaxbPluralAttribute.getOrderBy() ) ) { if ( StringHelper.isNotEmpty( jaxbPluralAttribute.getOrderBy() ) ) {
final MutableAnnotationUsage<OrderBy> orderByAnn = getOrMakeAnnotation( final MutableAnnotationUsage<OrderBy> orderByAnn = XmlProcessingHelper.getOrMakeAnnotation(
OrderBy.class, OrderBy.class,
memberDetails, memberDetails,
xmlDocumentContext xmlDocumentContext
@ -86,7 +86,7 @@ public class CommonPluralAttributeProcessing {
applyOrderColumn( jaxbPluralAttribute, memberDetails, xmlDocumentContext ); applyOrderColumn( jaxbPluralAttribute, memberDetails, xmlDocumentContext );
if ( StringHelper.isNotEmpty( jaxbPluralAttribute.getSort() ) ) { if ( StringHelper.isNotEmpty( jaxbPluralAttribute.getSort() ) ) {
final MutableAnnotationUsage<SortComparator> sortAnn = getOrMakeAnnotation( final MutableAnnotationUsage<SortComparator> sortAnn = XmlProcessingHelper.getOrMakeAnnotation(
SortComparator.class, SortComparator.class,
memberDetails, memberDetails,
xmlDocumentContext xmlDocumentContext
@ -96,14 +96,14 @@ public class CommonPluralAttributeProcessing {
} }
if ( jaxbPluralAttribute.getSortNatural() != null ) { if ( jaxbPluralAttribute.getSortNatural() != null ) {
getOrMakeAnnotation( SortNatural.class, memberDetails, xmlDocumentContext ); XmlProcessingHelper.getOrMakeAnnotation( SortNatural.class, memberDetails, xmlDocumentContext );
} }
// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
// map-key // map-key
if ( jaxbPluralAttribute.getMapKey() != null ) { if ( jaxbPluralAttribute.getMapKey() != null ) {
final MutableAnnotationUsage<MapKey> mapKeyAnn = getOrMakeAnnotation( MapKey.class, memberDetails, xmlDocumentContext ); final MutableAnnotationUsage<MapKey> mapKeyAnn = XmlProcessingHelper.getOrMakeAnnotation( MapKey.class, memberDetails, xmlDocumentContext );
applyOr( applyOr(
jaxbPluralAttribute.getMapKey(), jaxbPluralAttribute.getMapKey(),
JaxbMapKeyImpl::getName, JaxbMapKeyImpl::getName,
@ -115,18 +115,18 @@ public class CommonPluralAttributeProcessing {
if ( jaxbPluralAttribute.getMapKeyClass() != null ) { if ( jaxbPluralAttribute.getMapKeyClass() != null ) {
final ClassDetails mapKeyClass = classDetailsRegistry.resolveClassDetails( jaxbPluralAttribute.getMapKeyClass().getClazz() ); final ClassDetails mapKeyClass = classDetailsRegistry.resolveClassDetails( jaxbPluralAttribute.getMapKeyClass().getClazz() );
getOrMakeAnnotation( MapKeyClass.class, memberDetails, xmlDocumentContext ).setAttributeValue( "value", mapKeyClass ); XmlProcessingHelper.getOrMakeAnnotation( MapKeyClass.class, memberDetails, xmlDocumentContext ).setAttributeValue( "value", mapKeyClass );
} }
if ( jaxbPluralAttribute.getMapKeyTemporal() != null ) { if ( jaxbPluralAttribute.getMapKeyTemporal() != null ) {
getOrMakeAnnotation( MapKeyTemporal.class, memberDetails, xmlDocumentContext ).setAttributeValue( XmlProcessingHelper.getOrMakeAnnotation( MapKeyTemporal.class, memberDetails, xmlDocumentContext ).setAttributeValue(
"value", "value",
jaxbPluralAttribute.getMapKeyTemporal() jaxbPluralAttribute.getMapKeyTemporal()
); );
} }
if ( jaxbPluralAttribute.getMapKeyEnumerated() != null ) { if ( jaxbPluralAttribute.getMapKeyEnumerated() != null ) {
getOrMakeAnnotation( MapKeyEnumerated.class, memberDetails, xmlDocumentContext ).setAttributeValue( XmlProcessingHelper.getOrMakeAnnotation( MapKeyEnumerated.class, memberDetails, xmlDocumentContext ).setAttributeValue(
"value", "value",
jaxbPluralAttribute.getMapKeyEnumerated() jaxbPluralAttribute.getMapKeyEnumerated()
); );
@ -175,7 +175,7 @@ public class CommonPluralAttributeProcessing {
return; return;
} }
final MutableAnnotationUsage<OrderColumn> orderColumnAnn = getOrMakeAnnotation( final MutableAnnotationUsage<OrderColumn> orderColumnAnn = XmlProcessingHelper.getOrMakeAnnotation(
OrderColumn.class, OrderColumn.class,
memberDetails, memberDetails,
xmlDocumentContext xmlDocumentContext

View File

@ -1,17 +1,17 @@
/* /*
* Hibernate, Relational Persistence for Idiomatic Java * Hibernate, Relational Persistence for Idiomatic Java
* *
* SPDX-License-Identifier: Apache-2.0 * License: GNU Lesser General Public License (LGPL), version 2.1 or later.
* Copyright: Red Hat Inc. and Hibernate Authors * See the lgpl.txt file in the root directory or http://www.gnu.org/licenses/lgpl-2.1.html.
*/ */
package org.hibernate.boot.models.categorize.xml.internal.attr; package org.hibernate.boot.models.xml.internal.attr;
import org.hibernate.boot.internal.Target; import org.hibernate.boot.internal.Target;
import org.hibernate.boot.jaxb.mapping.spi.JaxbCollectionTableImpl; import org.hibernate.boot.jaxb.mapping.spi.JaxbCollectionTableImpl;
import org.hibernate.boot.jaxb.mapping.spi.JaxbElementCollectionImpl; import org.hibernate.boot.jaxb.mapping.spi.JaxbElementCollectionImpl;
import org.hibernate.boot.models.categorize.xml.internal.XmlAnnotationHelper; import org.hibernate.boot.models.xml.internal.XmlAnnotationHelper;
import org.hibernate.boot.models.categorize.xml.internal.XmlProcessingHelper; import org.hibernate.boot.models.xml.internal.XmlProcessingHelper;
import org.hibernate.boot.models.categorize.xml.spi.XmlDocumentContext; import org.hibernate.boot.models.xml.spi.XmlDocumentContext;
import org.hibernate.internal.util.StringHelper; import org.hibernate.internal.util.StringHelper;
import org.hibernate.models.internal.MutableAnnotationUsage; import org.hibernate.models.internal.MutableAnnotationUsage;
import org.hibernate.models.internal.MutableClassDetails; import org.hibernate.models.internal.MutableClassDetails;
@ -22,11 +22,7 @@ import jakarta.persistence.AccessType;
import jakarta.persistence.CollectionTable; import jakarta.persistence.CollectionTable;
import jakarta.persistence.ElementCollection; import jakarta.persistence.ElementCollection;
import static org.hibernate.boot.models.categorize.xml.internal.XmlAnnotationHelper.applyIndexes; import static org.hibernate.boot.models.xml.internal.XmlAnnotationHelper.applyOr;
import static org.hibernate.boot.models.categorize.xml.internal.XmlAnnotationHelper.applyOr;
import static org.hibernate.boot.models.categorize.xml.internal.XmlAnnotationHelper.applyUniqueConstraints;
import static org.hibernate.boot.models.categorize.xml.internal.XmlAnnotationHelper.createForeignKeyAnnotation;
import static org.hibernate.boot.models.categorize.xml.internal.XmlAnnotationHelper.createJoinColumns;
import static org.hibernate.internal.util.NullnessHelper.coalesce; import static org.hibernate.internal.util.NullnessHelper.coalesce;
/** /**
@ -111,21 +107,21 @@ public class ElementCollectionAttributeProcessing {
.getAnnotationDescriptorRegistry() .getAnnotationDescriptorRegistry()
.getDescriptor( CollectionTable.class ); .getDescriptor( CollectionTable.class );
applyOr( jaxbCollectionTable, JaxbCollectionTableImpl::getName, "name", collectionTableAnn, collectionTableDescriptor ); XmlAnnotationHelper.applyOr( jaxbCollectionTable, JaxbCollectionTableImpl::getName, "name", collectionTableAnn, collectionTableDescriptor );
applyOr( jaxbCollectionTable, JaxbCollectionTableImpl::getSchema, "schema", collectionTableAnn, collectionTableDescriptor ); XmlAnnotationHelper.applyOr( jaxbCollectionTable, JaxbCollectionTableImpl::getSchema, "schema", collectionTableAnn, collectionTableDescriptor );
applyOr( jaxbCollectionTable, JaxbCollectionTableImpl::getOptions, "options", collectionTableAnn, collectionTableDescriptor ); XmlAnnotationHelper.applyOr( jaxbCollectionTable, JaxbCollectionTableImpl::getOptions, "options", collectionTableAnn, collectionTableDescriptor );
collectionTableAnn.setAttributeValue( "joinColumns", createJoinColumns( jaxbCollectionTable.getJoinColumns(), memberDetails, xmlDocumentContext ) ); collectionTableAnn.setAttributeValue( "joinColumns", XmlAnnotationHelper.createJoinColumns( jaxbCollectionTable.getJoinColumns(), memberDetails, xmlDocumentContext ) );
if ( jaxbCollectionTable.getForeignKeys() != null ) { if ( jaxbCollectionTable.getForeignKeys() != null ) {
collectionTableAnn.setAttributeValue( collectionTableAnn.setAttributeValue(
"foreignKey", "foreignKey",
createForeignKeyAnnotation( jaxbCollectionTable.getForeignKeys(), memberDetails, xmlDocumentContext ) XmlAnnotationHelper.createForeignKeyAnnotation( jaxbCollectionTable.getForeignKeys(), memberDetails, xmlDocumentContext )
); );
} }
applyUniqueConstraints( jaxbCollectionTable.getUniqueConstraints(), memberDetails, collectionTableAnn, xmlDocumentContext ); XmlAnnotationHelper.applyUniqueConstraints( jaxbCollectionTable.getUniqueConstraints(), memberDetails, collectionTableAnn, xmlDocumentContext );
applyIndexes( jaxbCollectionTable.getIndexes(), memberDetails, collectionTableAnn, xmlDocumentContext ); XmlAnnotationHelper.applyIndexes( jaxbCollectionTable.getIndexes(), memberDetails, collectionTableAnn, xmlDocumentContext );
} }
} }

View File

@ -1,16 +1,16 @@
/* /*
* Hibernate, Relational Persistence for Idiomatic Java * Hibernate, Relational Persistence for Idiomatic Java
* *
* SPDX-License-Identifier: Apache-2.0 * License: GNU Lesser General Public License (LGPL), version 2.1 or later.
* Copyright: Red Hat Inc. and Hibernate Authors * See the lgpl.txt file in the root directory or http://www.gnu.org/licenses/lgpl-2.1.html.
*/ */
package org.hibernate.boot.models.categorize.xml.internal.attr; package org.hibernate.boot.models.xml.internal.attr;
import org.hibernate.boot.internal.Target; import org.hibernate.boot.internal.Target;
import org.hibernate.boot.jaxb.mapping.spi.JaxbEmbeddedImpl; import org.hibernate.boot.jaxb.mapping.spi.JaxbEmbeddedImpl;
import org.hibernate.boot.models.categorize.xml.internal.XmlAnnotationHelper; import org.hibernate.boot.models.xml.internal.XmlAnnotationHelper;
import org.hibernate.boot.models.categorize.xml.internal.XmlProcessingHelper; import org.hibernate.boot.models.xml.internal.XmlProcessingHelper;
import org.hibernate.boot.models.categorize.xml.spi.XmlDocumentContext; import org.hibernate.boot.models.xml.spi.XmlDocumentContext;
import org.hibernate.internal.util.StringHelper; import org.hibernate.internal.util.StringHelper;
import org.hibernate.models.internal.MutableAnnotationUsage; import org.hibernate.models.internal.MutableAnnotationUsage;
import org.hibernate.models.internal.MutableClassDetails; import org.hibernate.models.internal.MutableClassDetails;
@ -19,7 +19,7 @@ import org.hibernate.models.internal.MutableMemberDetails;
import jakarta.persistence.AccessType; import jakarta.persistence.AccessType;
import jakarta.persistence.Embedded; import jakarta.persistence.Embedded;
import static org.hibernate.boot.models.categorize.xml.internal.attr.CommonAttributeProcessing.applyAttributeBasics; import static org.hibernate.boot.models.xml.internal.attr.CommonAttributeProcessing.applyAttributeBasics;
import static org.hibernate.internal.util.NullnessHelper.coalesce; import static org.hibernate.internal.util.NullnessHelper.coalesce;
/** /**

View File

@ -1,15 +1,15 @@
/* /*
* Hibernate, Relational Persistence for Idiomatic Java * Hibernate, Relational Persistence for Idiomatic Java
* *
* SPDX-License-Identifier: Apache-2.0 * License: GNU Lesser General Public License (LGPL), version 2.1 or later.
* Copyright: Red Hat Inc. and Hibernate Authors * See the lgpl.txt file in the root directory or http://www.gnu.org/licenses/lgpl-2.1.html.
*/ */
package org.hibernate.boot.models.categorize.xml.internal.attr; package org.hibernate.boot.models.xml.internal.attr;
import org.hibernate.boot.jaxb.mapping.spi.JaxbEmbeddedIdImpl; import org.hibernate.boot.jaxb.mapping.spi.JaxbEmbeddedIdImpl;
import org.hibernate.boot.models.categorize.xml.internal.XmlAnnotationHelper; import org.hibernate.boot.models.xml.internal.XmlAnnotationHelper;
import org.hibernate.boot.models.categorize.xml.internal.XmlProcessingHelper; import org.hibernate.boot.models.xml.internal.XmlProcessingHelper;
import org.hibernate.boot.models.categorize.xml.spi.XmlDocumentContext; import org.hibernate.boot.models.xml.spi.XmlDocumentContext;
import org.hibernate.models.internal.MutableAnnotationUsage; import org.hibernate.models.internal.MutableAnnotationUsage;
import org.hibernate.models.internal.MutableClassDetails; import org.hibernate.models.internal.MutableClassDetails;
import org.hibernate.models.internal.MutableMemberDetails; import org.hibernate.models.internal.MutableMemberDetails;

View File

@ -0,0 +1,96 @@
/*
* Hibernate, Relational Persistence for Idiomatic Java
*
* License: GNU Lesser General Public License (LGPL), version 2.1 or later.
* See the lgpl.txt file in the root directory or http://www.gnu.org/licenses/lgpl-2.1.html.
*/
package org.hibernate.boot.models.xml.internal.attr;
import org.hibernate.boot.jaxb.mapping.spi.JaxbManyToManyImpl;
import org.hibernate.boot.jaxb.mapping.spi.JaxbOneToManyImpl;
import org.hibernate.boot.models.xml.internal.XmlAnnotationHelper;
import org.hibernate.boot.models.xml.internal.XmlProcessingHelper;
import org.hibernate.boot.models.xml.spi.XmlDocumentContext;
import org.hibernate.internal.util.StringHelper;
import org.hibernate.models.internal.MutableAnnotationUsage;
import org.hibernate.models.internal.MutableClassDetails;
import org.hibernate.models.internal.MutableMemberDetails;
import org.hibernate.models.spi.AnnotationDescriptor;
import jakarta.persistence.AccessType;
import jakarta.persistence.ManyToMany;
import jakarta.persistence.OneToMany;
import static org.hibernate.boot.models.xml.internal.XmlProcessingHelper.getOrMakeAnnotation;
import static org.hibernate.internal.util.NullnessHelper.coalesce;
/**
* @author Steve Ebersole
*/
public class ManyToManyAttributeProcessing {
@SuppressWarnings("UnusedReturnValue")
public static MutableMemberDetails processManyToManyAttribute(
JaxbManyToManyImpl jaxbManyToMany,
MutableClassDetails declarer,
AccessType classAccessType,
XmlDocumentContext xmlDocumentContext) {
final AccessType accessType = coalesce( jaxbManyToMany.getAccess(), classAccessType );
final MutableMemberDetails memberDetails = XmlProcessingHelper.getAttributeMember(
jaxbManyToMany.getName(),
accessType,
declarer
);
final MutableAnnotationUsage<ManyToMany> manyToManyAnn = applyManyToMany(
jaxbManyToMany,
memberDetails,
xmlDocumentContext
);
applyTargetEntity( jaxbManyToMany, manyToManyAnn, xmlDocumentContext );
XmlAnnotationHelper.applyCascading( jaxbManyToMany.getCascade(), memberDetails, xmlDocumentContext );
CommonAttributeProcessing.applyAttributeBasics( jaxbManyToMany, memberDetails, manyToManyAnn, accessType, xmlDocumentContext );
CommonPluralAttributeProcessing.applyPluralAttributeStructure( jaxbManyToMany, memberDetails, xmlDocumentContext );
return memberDetails;
}
private static MutableAnnotationUsage<ManyToMany> applyManyToMany(
JaxbManyToManyImpl jaxbManyToMany,
MutableMemberDetails memberDetails,
XmlDocumentContext xmlDocumentContext) {
final MutableAnnotationUsage<ManyToMany> manyToManyAnn = getOrMakeAnnotation(
ManyToMany.class,
memberDetails,
xmlDocumentContext
);
final AnnotationDescriptor<ManyToMany> manyToManyDescriptor = xmlDocumentContext
.getModelBuildingContext()
.getAnnotationDescriptorRegistry()
.getDescriptor( ManyToMany.class );
XmlAnnotationHelper.applyOr( jaxbManyToMany, JaxbManyToManyImpl::getFetch, "fetch", manyToManyAnn, manyToManyDescriptor );
XmlAnnotationHelper.applyOr( jaxbManyToMany, JaxbManyToManyImpl::getMappedBy, "mappedBy", manyToManyAnn, manyToManyDescriptor );
return manyToManyAnn;
}
private static void applyTargetEntity(
JaxbManyToManyImpl jaxbManyToMany,
MutableAnnotationUsage<ManyToMany> manyToManyAnn,
XmlDocumentContext xmlDocumentContext) {
final String targetEntity = jaxbManyToMany.getTargetEntity();
if ( StringHelper.isNotEmpty( targetEntity ) ) {
manyToManyAnn.setAttributeValue(
"targetEntity",
xmlDocumentContext.getModelBuildingContext()
.getClassDetailsRegistry()
.resolveClassDetails( targetEntity )
);
}
}
}

View File

@ -1,10 +1,10 @@
/* /*
* Hibernate, Relational Persistence for Idiomatic Java * Hibernate, Relational Persistence for Idiomatic Java
* *
* SPDX-License-Identifier: Apache-2.0 * License: GNU Lesser General Public License (LGPL), version 2.1 or later.
* Copyright: Red Hat Inc. and Hibernate Authors * See the lgpl.txt file in the root directory or http://www.gnu.org/licenses/lgpl-2.1.html.
*/ */
package org.hibernate.boot.models.categorize.xml.internal.attr; package org.hibernate.boot.models.xml.internal.attr;
import java.util.EnumSet; import java.util.EnumSet;
import java.util.List; import java.util.List;
@ -15,9 +15,9 @@ import org.hibernate.annotations.OnDelete;
import org.hibernate.annotations.OnDeleteAction; import org.hibernate.annotations.OnDeleteAction;
import org.hibernate.boot.internal.Target; import org.hibernate.boot.internal.Target;
import org.hibernate.boot.jaxb.mapping.spi.JaxbManyToOneImpl; import org.hibernate.boot.jaxb.mapping.spi.JaxbManyToOneImpl;
import org.hibernate.boot.models.categorize.xml.internal.XmlAnnotationHelper; import org.hibernate.boot.models.xml.internal.XmlAnnotationHelper;
import org.hibernate.boot.models.categorize.xml.internal.XmlProcessingHelper; import org.hibernate.boot.models.xml.internal.XmlProcessingHelper;
import org.hibernate.boot.models.categorize.xml.spi.XmlDocumentContext; import org.hibernate.boot.models.xml.spi.XmlDocumentContext;
import org.hibernate.internal.util.StringHelper; import org.hibernate.internal.util.StringHelper;
import org.hibernate.internal.util.collections.CollectionHelper; import org.hibernate.internal.util.collections.CollectionHelper;
import org.hibernate.models.internal.MutableAnnotationUsage; import org.hibernate.models.internal.MutableAnnotationUsage;
@ -28,8 +28,6 @@ import org.hibernate.models.spi.AnnotationDescriptor;
import jakarta.persistence.AccessType; import jakarta.persistence.AccessType;
import jakarta.persistence.ManyToOne; import jakarta.persistence.ManyToOne;
import static org.hibernate.boot.models.categorize.xml.internal.XmlAnnotationHelper.applyCascading;
import static org.hibernate.boot.models.categorize.xml.internal.XmlAnnotationHelper.applyJoinColumns;
import static org.hibernate.internal.util.NullnessHelper.coalesce; import static org.hibernate.internal.util.NullnessHelper.coalesce;
/** /**
@ -57,11 +55,11 @@ public class ManyToOneAttributeProcessing {
CommonAttributeProcessing.applyAttributeBasics( jaxbManyToOne, memberDetails, manyToOneAnn, accessType, xmlDocumentContext ); CommonAttributeProcessing.applyAttributeBasics( jaxbManyToOne, memberDetails, manyToOneAnn, accessType, xmlDocumentContext );
applyJoinColumns( jaxbManyToOne.getJoinColumns(), memberDetails, xmlDocumentContext ); XmlAnnotationHelper.applyJoinColumns( jaxbManyToOne.getJoinColumns(), memberDetails, xmlDocumentContext );
applyNotFound( memberDetails, jaxbManyToOne, manyToOneAnn, xmlDocumentContext ); applyNotFound( memberDetails, jaxbManyToOne, manyToOneAnn, xmlDocumentContext );
applyOnDelete( memberDetails, jaxbManyToOne, manyToOneAnn, xmlDocumentContext ); applyOnDelete( memberDetails, jaxbManyToOne, manyToOneAnn, xmlDocumentContext );
applyTarget( memberDetails, jaxbManyToOne, manyToOneAnn, xmlDocumentContext ); applyTarget( memberDetails, jaxbManyToOne, manyToOneAnn, xmlDocumentContext );
applyCascading( jaxbManyToOne.getCascade(), memberDetails, xmlDocumentContext ); XmlAnnotationHelper.applyCascading( jaxbManyToOne.getCascade(), memberDetails, xmlDocumentContext );
return memberDetails; return memberDetails;
} }
@ -70,8 +68,6 @@ public class ManyToOneAttributeProcessing {
MutableMemberDetails memberDetails, MutableMemberDetails memberDetails,
JaxbManyToOneImpl jaxbManyToOne, JaxbManyToOneImpl jaxbManyToOne,
XmlDocumentContext xmlDocumentContext) { XmlDocumentContext xmlDocumentContext) {
// todo : apply the @ManyToOne annotation
final MutableAnnotationUsage<ManyToOne> manyToOneAnn = XmlProcessingHelper.getOrMakeAnnotation( ManyToOne.class, memberDetails, xmlDocumentContext ); final MutableAnnotationUsage<ManyToOne> manyToOneAnn = XmlProcessingHelper.getOrMakeAnnotation( ManyToOne.class, memberDetails, xmlDocumentContext );
final AnnotationDescriptor<ManyToOne> manyToOneDescriptor = xmlDocumentContext final AnnotationDescriptor<ManyToOne> manyToOneDescriptor = xmlDocumentContext
.getModelBuildingContext() .getModelBuildingContext()

View File

@ -1,17 +1,17 @@
/* /*
* Hibernate, Relational Persistence for Idiomatic Java * Hibernate, Relational Persistence for Idiomatic Java
* *
* SPDX-License-Identifier: Apache-2.0 * License: GNU Lesser General Public License (LGPL), version 2.1 or later.
* Copyright: Red Hat Inc. and Hibernate Authors * See the lgpl.txt file in the root directory or http://www.gnu.org/licenses/lgpl-2.1.html.
*/ */
package org.hibernate.boot.models.categorize.xml.internal.attr; package org.hibernate.boot.models.xml.internal.attr;
import org.hibernate.annotations.NotFound; import org.hibernate.annotations.NotFound;
import org.hibernate.annotations.OnDelete; import org.hibernate.annotations.OnDelete;
import org.hibernate.boot.jaxb.mapping.spi.JaxbOneToManyImpl; import org.hibernate.boot.jaxb.mapping.spi.JaxbOneToManyImpl;
import org.hibernate.boot.models.categorize.xml.internal.XmlAnnotationHelper; import org.hibernate.boot.models.xml.internal.XmlAnnotationHelper;
import org.hibernate.boot.models.categorize.xml.internal.XmlProcessingHelper; import org.hibernate.boot.models.xml.internal.XmlProcessingHelper;
import org.hibernate.boot.models.categorize.xml.spi.XmlDocumentContext; import org.hibernate.boot.models.xml.spi.XmlDocumentContext;
import org.hibernate.internal.util.StringHelper; import org.hibernate.internal.util.StringHelper;
import org.hibernate.models.internal.MutableAnnotationUsage; import org.hibernate.models.internal.MutableAnnotationUsage;
import org.hibernate.models.internal.MutableClassDetails; import org.hibernate.models.internal.MutableClassDetails;
@ -21,8 +21,6 @@ import org.hibernate.models.spi.AnnotationDescriptor;
import jakarta.persistence.AccessType; import jakarta.persistence.AccessType;
import jakarta.persistence.OneToMany; import jakarta.persistence.OneToMany;
import static org.hibernate.boot.models.categorize.xml.internal.XmlAnnotationHelper.applyOr;
import static org.hibernate.boot.models.categorize.xml.internal.XmlProcessingHelper.getOrMakeAnnotation;
import static org.hibernate.internal.util.NullnessHelper.coalesce; import static org.hibernate.internal.util.NullnessHelper.coalesce;
/** /**
@ -41,7 +39,7 @@ public class OneToManyAttributeProcessing {
declarer declarer
); );
final MutableAnnotationUsage<OneToMany> oneToManyAnn = applyManyToOne( final MutableAnnotationUsage<OneToMany> oneToManyAnn = applyOneToMany(
jaxbOneToMany, jaxbOneToMany,
memberDetails, memberDetails,
xmlDocumentContext xmlDocumentContext
@ -74,29 +72,29 @@ public class OneToManyAttributeProcessing {
} ); } );
if ( jaxbOneToMany.getOnDelete() != null ) { if ( jaxbOneToMany.getOnDelete() != null ) {
getOrMakeAnnotation( OnDelete.class, memberDetails, xmlDocumentContext ).setAttributeValue( "action", jaxbOneToMany.getOnDelete() ); XmlProcessingHelper.getOrMakeAnnotation( OnDelete.class, memberDetails, xmlDocumentContext ).setAttributeValue( "action", jaxbOneToMany.getOnDelete() );
} }
if ( jaxbOneToMany.getNotFound() != null ) { if ( jaxbOneToMany.getNotFound() != null ) {
getOrMakeAnnotation( NotFound.class, memberDetails, xmlDocumentContext ).setAttributeValue( "action", jaxbOneToMany.getNotFound() ); XmlProcessingHelper.getOrMakeAnnotation( NotFound.class, memberDetails, xmlDocumentContext ).setAttributeValue( "action", jaxbOneToMany.getNotFound() );
} }
return memberDetails; return memberDetails;
} }
private static MutableAnnotationUsage<OneToMany> applyManyToOne( private static MutableAnnotationUsage<OneToMany> applyOneToMany(
JaxbOneToManyImpl jaxbOneToMany, JaxbOneToManyImpl jaxbOneToMany,
MutableMemberDetails memberDetails, MutableMemberDetails memberDetails,
XmlDocumentContext xmlDocumentContext) { XmlDocumentContext xmlDocumentContext) {
final MutableAnnotationUsage<OneToMany> oneToManyAnn = getOrMakeAnnotation( OneToMany.class, memberDetails, xmlDocumentContext ); final MutableAnnotationUsage<OneToMany> oneToManyAnn = XmlProcessingHelper.getOrMakeAnnotation( OneToMany.class, memberDetails, xmlDocumentContext );
final AnnotationDescriptor<OneToMany> oneToManyDescriptor = xmlDocumentContext final AnnotationDescriptor<OneToMany> oneToManyDescriptor = xmlDocumentContext
.getModelBuildingContext() .getModelBuildingContext()
.getAnnotationDescriptorRegistry() .getAnnotationDescriptorRegistry()
.getDescriptor( OneToMany.class ); .getDescriptor( OneToMany.class );
applyOr( jaxbOneToMany, JaxbOneToManyImpl::getFetch, "fetch", oneToManyAnn, oneToManyDescriptor ); XmlAnnotationHelper.applyOr( jaxbOneToMany, JaxbOneToManyImpl::getFetch, "fetch", oneToManyAnn, oneToManyDescriptor );
applyOr( jaxbOneToMany, JaxbOneToManyImpl::getMappedBy, "mappedBy", oneToManyAnn, oneToManyDescriptor ); XmlAnnotationHelper.applyOr( jaxbOneToMany, JaxbOneToManyImpl::getMappedBy, "mappedBy", oneToManyAnn, oneToManyDescriptor );
applyOr( jaxbOneToMany, JaxbOneToManyImpl::isOrphanRemoval, "orphanRemoval", oneToManyAnn, oneToManyDescriptor ); XmlAnnotationHelper.applyOr( jaxbOneToMany, JaxbOneToManyImpl::isOrphanRemoval, "orphanRemoval", oneToManyAnn, oneToManyDescriptor );
return oneToManyAnn; return oneToManyAnn;
} }
@ -109,9 +107,7 @@ public class OneToManyAttributeProcessing {
if ( StringHelper.isNotEmpty( targetEntity ) ) { if ( StringHelper.isNotEmpty( targetEntity ) ) {
oneToManyAnn.setAttributeValue( oneToManyAnn.setAttributeValue(
"targetEntity", "targetEntity",
xmlDocumentContext.getModelBuildingContext() xmlDocumentContext.resolveJavaType( targetEntity )
.getClassDetailsRegistry()
.resolveClassDetails( targetEntity )
); );
} }
} }

View File

@ -0,0 +1,94 @@
/*
* Hibernate, Relational Persistence for Idiomatic Java
*
* License: GNU Lesser General Public License (LGPL), version 2.1 or later.
* See the lgpl.txt file in the root directory or http://www.gnu.org/licenses/lgpl-2.1.html.
*/
package org.hibernate.boot.models.xml.internal.attr;
import org.hibernate.boot.internal.Target;
import org.hibernate.boot.jaxb.mapping.spi.JaxbOneToOneImpl;
import org.hibernate.boot.models.xml.internal.XmlAnnotationHelper;
import org.hibernate.boot.models.xml.internal.XmlProcessingHelper;
import org.hibernate.boot.models.xml.spi.XmlDocumentContext;
import org.hibernate.internal.util.StringHelper;
import org.hibernate.models.internal.MutableAnnotationUsage;
import org.hibernate.models.internal.MutableClassDetails;
import org.hibernate.models.internal.MutableMemberDetails;
import org.hibernate.models.spi.AnnotationDescriptor;
import jakarta.persistence.AccessType;
import jakarta.persistence.OneToOne;
import static org.hibernate.boot.models.xml.internal.XmlAnnotationHelper.applyCascading;
import static org.hibernate.boot.models.xml.internal.XmlProcessingHelper.getOrMakeAnnotation;
import static org.hibernate.boot.models.xml.internal.attr.CommonAttributeProcessing.applyAttributeBasics;
import static org.hibernate.internal.util.NullnessHelper.coalesce;
/**
* @author Steve Ebersole
*/
public class OneToOneAttributeProcessing {
@SuppressWarnings("UnusedReturnValue")
public static MutableMemberDetails processOneToOneAttribute(
JaxbOneToOneImpl jaxbOneToOne,
MutableClassDetails declarer,
AccessType classAccessType,
XmlDocumentContext xmlDocumentContext) {
final AccessType accessType = coalesce( jaxbOneToOne.getAccess(), classAccessType );
final MutableMemberDetails memberDetails = XmlProcessingHelper.getAttributeMember(
jaxbOneToOne.getName(),
accessType,
declarer
);
final MutableAnnotationUsage<OneToOne> oneToOneAnn = applyOneToOne(
memberDetails,
jaxbOneToOne,
xmlDocumentContext
);
applyAttributeBasics( jaxbOneToOne, memberDetails, oneToOneAnn, accessType, xmlDocumentContext );
applyTarget( memberDetails, jaxbOneToOne, oneToOneAnn, xmlDocumentContext );
applyCascading( jaxbOneToOne.getCascade(), memberDetails, xmlDocumentContext );
return memberDetails;
}
private static MutableAnnotationUsage<OneToOne> applyOneToOne(
MutableMemberDetails memberDetails,
JaxbOneToOneImpl jaxbOneToOne,
XmlDocumentContext xmlDocumentContext) {
final MutableAnnotationUsage<OneToOne> oneToOneAnn = getOrMakeAnnotation( OneToOne.class, memberDetails, xmlDocumentContext );
final AnnotationDescriptor<OneToOne> oneToOneDescriptor = xmlDocumentContext
.getModelBuildingContext()
.getAnnotationDescriptorRegistry()
.getDescriptor( OneToOne.class );
XmlAnnotationHelper.applyOr(
jaxbOneToOne,
JaxbOneToOneImpl::getFetch,
"fetch",
oneToOneAnn,
oneToOneDescriptor
);
return oneToOneAnn;
}
@SuppressWarnings("unused")
private static void applyTarget(
MutableMemberDetails memberDetails,
JaxbOneToOneImpl jaxbOneToOne,
MutableAnnotationUsage<OneToOne> oneToOneAnn,
XmlDocumentContext xmlDocumentContext) {
final String targetEntityName = jaxbOneToOne.getTargetEntity();
if ( StringHelper.isEmpty( targetEntityName ) ) {
return;
}
final MutableAnnotationUsage<Target> targetAnn = XmlProcessingHelper.makeAnnotation( Target.class, memberDetails, xmlDocumentContext );
targetAnn.setAttributeValue( "value", targetEntityName );
}
}

View File

@ -1,13 +1,13 @@
/* /*
* Hibernate, Relational Persistence for Idiomatic Java * Hibernate, Relational Persistence for Idiomatic Java
* *
* SPDX-License-Identifier: Apache-2.0 * License: GNU Lesser General Public License (LGPL), version 2.1 or later.
* Copyright: Red Hat Inc. and Hibernate Authors * See the lgpl.txt file in the root directory or http://www.gnu.org/licenses/lgpl-2.1.html.
*/ */
package org.hibernate.boot.models.categorize.xml.internal.attr; package org.hibernate.boot.models.xml.internal.attr;
import org.hibernate.boot.jaxb.mapping.spi.JaxbPluralAnyMappingImpl; import org.hibernate.boot.jaxb.mapping.spi.JaxbPluralAnyMappingImpl;
import org.hibernate.boot.models.categorize.xml.spi.XmlDocumentContext; import org.hibernate.boot.models.xml.spi.XmlDocumentContext;
import org.hibernate.models.internal.MutableClassDetails; import org.hibernate.models.internal.MutableClassDetails;
import org.hibernate.models.internal.MutableMemberDetails; import org.hibernate.models.internal.MutableMemberDetails;

View File

@ -1,10 +1,10 @@
/* /*
* Hibernate, Relational Persistence for Idiomatic Java * Hibernate, Relational Persistence for Idiomatic Java
* *
* SPDX-License-Identifier: Apache-2.0 * License: GNU Lesser General Public License (LGPL), version 2.1 or later.
* Copyright: Red Hat Inc. and Hibernate Authors * See the lgpl.txt file in the root directory or http://www.gnu.org/licenses/lgpl-2.1.html.
*/ */
package org.hibernate.boot.models.categorize.xml.internal.db; package org.hibernate.boot.models.xml.internal.db;
import java.lang.annotation.Annotation; import java.lang.annotation.Annotation;
@ -18,13 +18,12 @@ import org.hibernate.boot.jaxb.mapping.spi.db.JaxbColumnSizable;
import org.hibernate.boot.jaxb.mapping.spi.db.JaxbColumnStandard; import org.hibernate.boot.jaxb.mapping.spi.db.JaxbColumnStandard;
import org.hibernate.boot.jaxb.mapping.spi.db.JaxbColumnUniqueable; import org.hibernate.boot.jaxb.mapping.spi.db.JaxbColumnUniqueable;
import org.hibernate.boot.jaxb.mapping.spi.db.JaxbCommentable; import org.hibernate.boot.jaxb.mapping.spi.db.JaxbCommentable;
import org.hibernate.boot.models.categorize.xml.spi.XmlDocumentContext; import org.hibernate.boot.models.xml.spi.XmlDocumentContext;
import org.hibernate.boot.models.xml.internal.XmlAnnotationHelper;
import org.hibernate.internal.util.StringHelper; import org.hibernate.internal.util.StringHelper;
import org.hibernate.models.internal.MutableAnnotationTarget; import org.hibernate.models.internal.MutableAnnotationTarget;
import org.hibernate.models.internal.MutableAnnotationUsage; import org.hibernate.models.internal.MutableAnnotationUsage;
import static org.hibernate.boot.models.categorize.xml.internal.XmlAnnotationHelper.applyCheckConstraints;
/** /**
* @author Steve Ebersole * @author Steve Ebersole
*/ */
@ -45,7 +44,7 @@ public class ColumnProcessing {
applyColumnDefinition( jaxbColumn, target, columnAnn, xmlDocumentContext ); applyColumnDefinition( jaxbColumn, target, columnAnn, xmlDocumentContext );
applyColumnUniqueness( jaxbColumn, target, columnAnn, xmlDocumentContext ); applyColumnUniqueness( jaxbColumn, target, columnAnn, xmlDocumentContext );
applyColumnComment( jaxbColumn, target, columnAnn, xmlDocumentContext ); applyColumnComment( jaxbColumn, target, columnAnn, xmlDocumentContext );
applyCheckConstraints( jaxbColumn, target, columnAnn, xmlDocumentContext ); XmlAnnotationHelper.applyCheckConstraints( jaxbColumn, target, columnAnn, xmlDocumentContext );
if ( jaxbColumn instanceof JaxbColumnSizable sizable ) { if ( jaxbColumn instanceof JaxbColumnSizable sizable ) {
applyColumnSizing( sizable, target, columnAnn, xmlDocumentContext ); applyColumnSizing( sizable, target, columnAnn, xmlDocumentContext );
@ -69,7 +68,7 @@ public class ColumnProcessing {
applyColumnSizing( jaxbColumn, target, columnAnn, xmlDocumentContext ); applyColumnSizing( jaxbColumn, target, columnAnn, xmlDocumentContext );
applyColumnUniqueness( jaxbColumn, target, columnAnn, xmlDocumentContext ); applyColumnUniqueness( jaxbColumn, target, columnAnn, xmlDocumentContext );
applyColumnComment( jaxbColumn, target, columnAnn, xmlDocumentContext ); applyColumnComment( jaxbColumn, target, columnAnn, xmlDocumentContext );
applyCheckConstraints( jaxbColumn, target, columnAnn, xmlDocumentContext ); XmlAnnotationHelper.applyCheckConstraints( jaxbColumn, target, columnAnn, xmlDocumentContext );
} }
public static <A extends Annotation> void applyColumnDetails( public static <A extends Annotation> void applyColumnDetails(
@ -108,7 +107,7 @@ public class ColumnProcessing {
} }
if ( jaxbColumn instanceof JaxbCheckable checkable ) { if ( jaxbColumn instanceof JaxbCheckable checkable ) {
applyCheckConstraints( checkable, target, columnAnn, xmlDocumentContext ); XmlAnnotationHelper.applyCheckConstraints( checkable, target, columnAnn, xmlDocumentContext );
} }
} }

View File

@ -1,8 +1,8 @@
/* /*
* Hibernate, Relational Persistence for Idiomatic Java * Hibernate, Relational Persistence for Idiomatic Java
* *
* SPDX-License-Identifier: Apache-2.0 * License: GNU Lesser General Public License (LGPL), version 2.1 or later.
* Copyright: Red Hat Inc. and Hibernate Authors * See the lgpl.txt file in the root directory or http://www.gnu.org/licenses/lgpl-2.1.html.
*/ */
/** /**
@ -29,7 +29,7 @@
* </dl> * </dl>
* <p/> * <p/>
* When operating in metadata-complete mode, * When operating in metadata-complete mode,
* {@linkplain org.hibernate.boot.models.categorize.xml.internal.ManagedTypeProcessor} will first clear * {@linkplain org.hibernate.boot.models.xml.internal.ManagedTypeProcessor} will first clear
* all annotations from the managed type's * all annotations from the managed type's
* {@linkplain org.hibernate.models.spi.ClassDetails class}, * {@linkplain org.hibernate.models.spi.ClassDetails class},
* {@linkplain org.hibernate.models.spi.FieldDetails fields} and * {@linkplain org.hibernate.models.spi.FieldDetails fields} and
@ -38,4 +38,4 @@
* *
* @author Steve Ebersole * @author Steve Ebersole
*/ */
package org.hibernate.boot.models.categorize.xml.internal; package org.hibernate.boot.models.xml.internal;

View File

@ -1,8 +1,8 @@
/* /*
* Hibernate, Relational Persistence for Idiomatic Java * Hibernate, Relational Persistence for Idiomatic Java
* *
* SPDX-License-Identifier: Apache-2.0 * License: GNU Lesser General Public License (LGPL), version 2.1 or later.
* Copyright: Red Hat Inc. and Hibernate Authors * See the lgpl.txt file in the root directory or http://www.gnu.org/licenses/lgpl-2.1.html.
*/ */
/** /**
@ -11,19 +11,19 @@
* on the model's {@linkplain org.hibernate.models.spi.AnnotationTarget targets} * on the model's {@linkplain org.hibernate.models.spi.AnnotationTarget targets}
* based on the XML.<ol> * based on the XML.<ol>
* <li> * <li>
* First performs some {@linkplain org.hibernate.boot.models.categorize.xml.spi.XmlPreProcessor pre-processing} * First performs some {@linkplain org.hibernate.boot.models.xml.spi.XmlPreProcessor pre-processing}
* which aggregates information across all XML mappings * which aggregates information across all XML mappings
* </li> * </li>
* <li> * <li>
* Next performs XML {@linkplain org.hibernate.boot.models.categorize.xml.spi.XmlProcessor processing} which * Next performs XML {@linkplain org.hibernate.boot.models.xml.spi.XmlProcessor processing} which
* applies metadata-complete mappings and collects overlay/override XML for later application. * applies metadata-complete mappings and collects overlay/override XML for later application.
* </li> * </li>
* <li> * <li>
* Performs XML {@linkplain org.hibernate.boot.models.categorize.xml.spi.XmlProcessingResult post-processing} which * Performs XML {@linkplain org.hibernate.boot.models.xml.spi.XmlProcessingResult post-processing} which
* applies overlay/override XML. * applies overlay/override XML.
* </li> * </li>
* </ol> * </ol>
* *
* @author Steve Ebersole * @author Steve Ebersole
*/ */
package org.hibernate.boot.models.categorize.xml; package org.hibernate.boot.models.xml;

View File

@ -1,10 +1,10 @@
/* /*
* Hibernate, Relational Persistence for Idiomatic Java * Hibernate, Relational Persistence for Idiomatic Java
* *
* SPDX-License-Identifier: Apache-2.0 * License: GNU Lesser General Public License (LGPL), version 2.1 or later.
* Copyright: Red Hat Inc. and Hibernate Authors * See the lgpl.txt file in the root directory or http://www.gnu.org/licenses/lgpl-2.1.html.
*/ */
package org.hibernate.boot.models.categorize.xml.spi; package org.hibernate.boot.models.xml.spi;
import java.util.EnumSet; import java.util.EnumSet;

View File

@ -1,10 +1,10 @@
/* /*
* Hibernate, Relational Persistence for Idiomatic Java * Hibernate, Relational Persistence for Idiomatic Java
* *
* SPDX-License-Identifier: Apache-2.0 * License: GNU Lesser General Public License (LGPL), version 2.1 or later.
* Copyright: Red Hat Inc. and Hibernate Authors * See the lgpl.txt file in the root directory or http://www.gnu.org/licenses/lgpl-2.1.html.
*/ */
package org.hibernate.boot.models.categorize.xml.spi; package org.hibernate.boot.models.xml.spi;
import java.util.List; import java.util.List;
import java.util.Map; import java.util.Map;

View File

@ -0,0 +1,40 @@
/*
* Hibernate, Relational Persistence for Idiomatic Java
*
* License: GNU Lesser General Public License (LGPL), version 2.1 or later.
* See the lgpl.txt file in the root directory or http://www.gnu.org/licenses/lgpl-2.1.html.
*/
package org.hibernate.boot.models.xml.spi;
import org.hibernate.boot.models.xml.internal.XmlAnnotationHelper;
import org.hibernate.models.internal.MutableClassDetails;
import org.hibernate.models.spi.SourceModelBuildingContext;
/**
* Context for a specific XML mapping file
*
* @author Steve Ebersole
*/
public interface XmlDocumentContext {
/**
* The XML document
*/
XmlDocument getXmlDocument();
/**
* The {@code <persistence-unit-metadata/>} defined by the XML document
*/
PersistenceUnitMetadata getPersistenceUnitMetadata();
/**
* Access to the containing context
*/
SourceModelBuildingContext getModelBuildingContext();
/**
* Resolve a ClassDetails by name, accounting for XML-defined package name if one.
*/
default MutableClassDetails resolveJavaType(String name) {
return (MutableClassDetails) XmlAnnotationHelper.resolveJavaType( name, this );
}
}

View File

@ -1,10 +1,10 @@
/* /*
* Hibernate, Relational Persistence for Idiomatic Java * Hibernate, Relational Persistence for Idiomatic Java
* *
* SPDX-License-Identifier: Apache-2.0 * License: GNU Lesser General Public License (LGPL), version 2.1 or later.
* Copyright: Red Hat Inc. and Hibernate Authors * See the lgpl.txt file in the root directory or http://www.gnu.org/licenses/lgpl-2.1.html.
*/ */
package org.hibernate.boot.models.categorize.xml.spi; package org.hibernate.boot.models.xml.spi;
import java.util.List; import java.util.List;

View File

@ -1,16 +1,17 @@
/* /*
* Hibernate, Relational Persistence for Idiomatic Java * Hibernate, Relational Persistence for Idiomatic Java
* *
* SPDX-License-Identifier: Apache-2.0 * License: GNU Lesser General Public License (LGPL), version 2.1 or later.
* Copyright: Red Hat Inc. and Hibernate Authors * See the lgpl.txt file in the root directory or http://www.gnu.org/licenses/lgpl-2.1.html.
*/ */
package org.hibernate.boot.models.categorize.xml.spi; package org.hibernate.boot.models.xml.spi;
import org.hibernate.boot.jaxb.hbm.spi.JaxbHbmHibernateMapping;
import org.hibernate.boot.jaxb.mapping.spi.JaxbEntityMappingsImpl; import org.hibernate.boot.jaxb.mapping.spi.JaxbEntityMappingsImpl;
import org.hibernate.boot.jaxb.spi.Binding; import org.hibernate.boot.jaxb.spi.Binding;
import org.hibernate.boot.jaxb.spi.JaxbBindableMappingDescriptor; import org.hibernate.boot.jaxb.spi.JaxbBindableMappingDescriptor;
import org.hibernate.boot.model.process.spi.ManagedResources; import org.hibernate.boot.model.process.spi.ManagedResources;
import org.hibernate.boot.models.categorize.xml.internal.XmlPreProcessingResultImpl; import org.hibernate.boot.models.xml.internal.XmlPreProcessingResultImpl;
/** /**
* Performs pre-processing across XML mappings to collect data * Performs pre-processing across XML mappings to collect data
@ -27,7 +28,12 @@ public class XmlPreProcessor {
final XmlPreProcessingResultImpl collected = new XmlPreProcessingResultImpl(); final XmlPreProcessingResultImpl collected = new XmlPreProcessingResultImpl();
for ( Binding<JaxbBindableMappingDescriptor> mappingXmlBinding : managedResources.getXmlMappingBindings() ) { for ( Binding<JaxbBindableMappingDescriptor> mappingXmlBinding : managedResources.getXmlMappingBindings() ) {
collected.addDocument( (JaxbEntityMappingsImpl) mappingXmlBinding.getRoot() ); // for now skip hbm.xml
final JaxbBindableMappingDescriptor root = mappingXmlBinding.getRoot();
if ( root instanceof JaxbHbmHibernateMapping ) {
continue;
}
collected.addDocument( (JaxbEntityMappingsImpl) root );
} }
return collected; return collected;

View File

@ -1,10 +1,10 @@
/* /*
* Hibernate, Relational Persistence for Idiomatic Java * Hibernate, Relational Persistence for Idiomatic Java
* *
* SPDX-License-Identifier: Apache-2.0 * License: GNU Lesser General Public License (LGPL), version 2.1 or later.
* Copyright: Red Hat Inc. and Hibernate Authors * See the lgpl.txt file in the root directory or http://www.gnu.org/licenses/lgpl-2.1.html.
*/ */
package org.hibernate.boot.models.categorize.xml.spi; package org.hibernate.boot.models.xml.spi;
import java.util.List; import java.util.List;

View File

@ -1,16 +1,16 @@
/* /*
* Hibernate, Relational Persistence for Idiomatic Java * Hibernate, Relational Persistence for Idiomatic Java
* *
* SPDX-License-Identifier: Apache-2.0 * License: GNU Lesser General Public License (LGPL), version 2.1 or later.
* Copyright: Red Hat Inc. and Hibernate Authors * See the lgpl.txt file in the root directory or http://www.gnu.org/licenses/lgpl-2.1.html.
*/ */
package org.hibernate.boot.models.categorize.xml.spi; package org.hibernate.boot.models.xml.spi;
import org.hibernate.boot.models.categorize.internal.DomainModelCategorizationCollector; import org.hibernate.boot.models.categorize.internal.DomainModelCategorizationCollector;
import org.hibernate.boot.models.categorize.xml.internal.ManagedTypeProcessor; import org.hibernate.boot.models.xml.internal.ManagedTypeProcessor;
import org.hibernate.boot.models.categorize.xml.internal.XmlDocumentContextImpl; import org.hibernate.boot.models.xml.internal.XmlDocumentContextImpl;
import org.hibernate.boot.models.categorize.xml.internal.XmlDocumentImpl; import org.hibernate.boot.models.xml.internal.XmlDocumentImpl;
import org.hibernate.boot.models.categorize.xml.internal.XmlProcessingResultImpl; import org.hibernate.boot.models.xml.internal.XmlProcessingResultImpl;
import org.hibernate.models.spi.SourceModelBuildingContext; import org.hibernate.models.spi.SourceModelBuildingContext;
/** /**

View File

@ -504,4 +504,38 @@ public final class CollectionHelper {
} }
return result; return result;
} }
public static <E> List<E> mutableJoin(Collection<E> first, Collection<E> second) {
final int totalCount = ( first == null ? 0 : first.size() )
+ ( second == null ? 0 : second.size() );
if ( totalCount == 0 ) {
return new ArrayList<>();
}
final ArrayList<E> joined = new ArrayList<>( totalCount );
if ( first != null ) {
joined.addAll( first );
}
if ( second != null ) {
joined.addAll( second );
}
return joined;
}
public static <E> List<E> mutableJoin(Collection<E> first, Collection<E>... others) {
// it can be empty, but not null
assert first != null;
if ( isEmpty( others ) ) {
final ArrayList<E> list = new ArrayList<>( first.size() );
list.addAll( first );
return list;
}
final List<E> joined = arrayList( first.size() + ( isEmpty( others ) ? 0 : others.length * 8 ) );
joined.addAll( first );
for ( Collection<E> other : others ) {
joined.addAll( other );
}
return joined;
}
} }

View File

@ -70,8 +70,8 @@ import static org.hibernate.metamodel.mapping.EntityDiscriminatorMapping.DISCRIM
/** /**
* A mapping model object that represents an {@linkplain jakarta.persistence.Embeddable embeddable class}. * A mapping model object that represents an {@linkplain jakarta.persistence.Embeddable embeddable class}.
* *
* @apiNote The name of this class is historical and unfortunate. An embeddable class holds a "component" * @apiNote The name of this class is historical and unfortunate. It reflects modeling a *composition*
* of the state of an entity. It has absolutely nothing to do with modularity in software engineering. * of state. It has absolutely nothing to do with modularity in software engineering.
* *
* @author Gavin King * @author Gavin King
* @author Steve Ebersole * @author Steve Ebersole

View File

@ -12,6 +12,7 @@ import org.junit.Test;
import org.hibernate.AnnotationException; import org.hibernate.AnnotationException;
import org.hibernate.SessionFactory; import org.hibernate.SessionFactory;
import org.hibernate.boot.models.AccessTypeDeterminationException;
import org.hibernate.cfg.Configuration; import org.hibernate.cfg.Configuration;
import org.hibernate.cfg.Environment; import org.hibernate.cfg.Environment;
import org.hibernate.service.ServiceRegistry; import org.hibernate.service.ServiceRegistry;
@ -35,7 +36,7 @@ public class SafeMappingTest {
sessionFactory = cfg.buildSessionFactory( serviceRegistry ); sessionFactory = cfg.buildSessionFactory( serviceRegistry );
fail( "Entity wo id should fail" ); fail( "Entity wo id should fail" );
} }
catch (AnnotationException e) { catch (AnnotationException | AccessTypeDeterminationException e) {
//success //success
} }
finally { finally {

View File

@ -31,7 +31,6 @@ public class BasketItems implements Serializable {
@ManyToOne(cascade={ CascadeType.MERGE, CascadeType.PERSIST, CascadeType.REFRESH }) @ManyToOne(cascade={ CascadeType.MERGE, CascadeType.PERSIST, CascadeType.REFRESH })
@JoinColumn(name="basketDatetime", referencedColumnName="basketDatetime") @JoinColumn(name="basketDatetime", referencedColumnName="basketDatetime")
@JoinColumn(name="customerID", referencedColumnName="customerID") @JoinColumn(name="customerID", referencedColumnName="customerID")
@Basic(fetch= FetchType.LAZY)
private ShoppingBaskets shoppingBaskets; private ShoppingBaskets shoppingBaskets;
@Column(name="cost", nullable=false) @Column(name="cost", nullable=false)

View File

@ -31,7 +31,6 @@ public class ShoppingBaskets implements Serializable {
@Id @Id
@ManyToOne(cascade={ CascadeType.MERGE, CascadeType.PERSIST, CascadeType.REFRESH }) @ManyToOne(cascade={ CascadeType.MERGE, CascadeType.PERSIST, CascadeType.REFRESH })
@JoinColumn(name="customerID", referencedColumnName="customerID") @JoinColumn(name="customerID", referencedColumnName="customerID")
@Basic(fetch=FetchType.LAZY)
private Customers owner; private Customers owner;
@Column(name="basketDatetime", nullable=false) @Column(name="basketDatetime", nullable=false)

View File

@ -1,7 +1,5 @@
package org.hibernate.orm.test.annotations.various; package org.hibernate.orm.test.annotations.various;
import org.hibernate.annotations.Generated;
import org.hibernate.annotations.GenerationTime;
import org.hibernate.annotations.Subselect; import org.hibernate.annotations.Subselect;
import org.hibernate.testing.TestForIssue; import org.hibernate.testing.TestForIssue;
@ -56,7 +54,6 @@ public class OneOneGeneratedValueTest {
private String name; private String name;
@Generated(GenerationTime.INSERT)
@OneToOne(mappedBy = "a") @OneToOne(mappedBy = "a")
private EntityB b; private EntityB b;

View File

@ -17,7 +17,7 @@ import org.hibernate.boot.jaxb.internal.MappingBinder;
import org.hibernate.boot.jaxb.mapping.spi.JaxbEntityMappingsImpl; import org.hibernate.boot.jaxb.mapping.spi.JaxbEntityMappingsImpl;
import org.hibernate.boot.jaxb.spi.Binding; import org.hibernate.boot.jaxb.spi.Binding;
import org.hibernate.boot.jaxb.spi.JaxbBindableMappingDescriptor; import org.hibernate.boot.jaxb.spi.JaxbBindableMappingDescriptor;
import org.hibernate.boot.models.categorize.xml.XmlResourceException; import org.hibernate.boot.models.xml.XmlResourceException;
import org.hibernate.models.spi.ClassLoading; import org.hibernate.models.spi.ClassLoading;
import static org.hibernate.boot.jaxb.internal.MappingBinder.NON_VALIDATING; import static org.hibernate.boot.jaxb.internal.MappingBinder.NON_VALIDATING;

View File

@ -24,7 +24,7 @@ import org.hibernate.boot.models.categorize.spi.EntityHierarchy;
import org.hibernate.boot.models.categorize.spi.ManagedResourcesProcessor; import org.hibernate.boot.models.categorize.spi.ManagedResourcesProcessor;
import org.hibernate.boot.registry.StandardServiceRegistry; import org.hibernate.boot.registry.StandardServiceRegistry;
import org.hibernate.boot.registry.StandardServiceRegistryBuilder; import org.hibernate.boot.registry.StandardServiceRegistryBuilder;
import org.hibernate.orm.test.boot.models.ManagedResourcesImpl; import org.hibernate.boot.model.source.internal.annotations.AdditionalManagedResourcesImpl;
/** /**
* @author Steve Ebersole * @author Steve Ebersole
@ -112,7 +112,7 @@ public class BindingTestingHelper {
} }
public static Set<EntityHierarchy> buildHierarchyMetadata(Class<?>... classes) { public static Set<EntityHierarchy> buildHierarchyMetadata(Class<?>... classes) {
final ManagedResources managedResources = new ManagedResourcesImpl.Builder() final ManagedResources managedResources = new AdditionalManagedResourcesImpl.Builder()
.addLoadedClasses(classes) .addLoadedClasses(classes)
.build(); .build();
@ -130,7 +130,7 @@ public class BindingTestingHelper {
} }
public static CategorizedDomainModel buildCategorizedDomainModel(Class<?>... classes) { public static CategorizedDomainModel buildCategorizedDomainModel(Class<?>... classes) {
final ManagedResources managedResources = new ManagedResourcesImpl.Builder() final ManagedResources managedResources = new AdditionalManagedResourcesImpl.Builder()
.addLoadedClasses(classes) .addLoadedClasses(classes)
.build(); .build();

View File

@ -12,7 +12,7 @@ import java.util.Map;
import org.hibernate.boot.internal.MetadataBuilderImpl; import org.hibernate.boot.internal.MetadataBuilderImpl;
import org.hibernate.boot.model.process.spi.ManagedResources; import org.hibernate.boot.model.process.spi.ManagedResources;
import org.hibernate.orm.test.boot.models.BootstrapContextTesting; import org.hibernate.orm.test.boot.models.BootstrapContextTesting;
import org.hibernate.orm.test.boot.models.ManagedResourcesImpl; import org.hibernate.boot.model.source.internal.annotations.AdditionalManagedResourcesImpl;
import org.hibernate.orm.test.boot.models.MyStringConverter; import org.hibernate.orm.test.boot.models.MyStringConverter;
import org.hibernate.orm.test.boot.models.MyUuidConverter; import org.hibernate.orm.test.boot.models.MyUuidConverter;
import org.hibernate.orm.test.boot.models.SourceModelTestHelper; import org.hibernate.orm.test.boot.models.SourceModelTestHelper;
@ -51,7 +51,7 @@ public class SimpleProcessorTests {
// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
// ManagedResources is built by scanning and from explicit resources // ManagedResources is built by scanning and from explicit resources
// during ORM bootstrap // during ORM bootstrap
final ManagedResourcesImpl.Builder managedResourcesBuilder = new ManagedResourcesImpl.Builder(); final AdditionalManagedResourcesImpl.Builder managedResourcesBuilder = new AdditionalManagedResourcesImpl.Builder();
managedResourcesBuilder managedResourcesBuilder
.addLoadedClasses( Person.class, Root.class, Sub.class, MyStringConverter.class, MyUuidConverter.class ) .addLoadedClasses( Person.class, Root.class, Sub.class, MyStringConverter.class, MyUuidConverter.class )
.addPackages( "org.hibernate.models.orm.process" ); .addPackages( "org.hibernate.models.orm.process" );

View File

@ -14,9 +14,9 @@ import org.hibernate.orm.test.boot.models.SourceModelTestHelper;
import org.hibernate.boot.models.categorize.internal.DomainModelCategorizationCollector; import org.hibernate.boot.models.categorize.internal.DomainModelCategorizationCollector;
import org.hibernate.boot.models.categorize.internal.GlobalRegistrationsImpl; import org.hibernate.boot.models.categorize.internal.GlobalRegistrationsImpl;
import org.hibernate.boot.models.categorize.spi.FilterDefRegistration; import org.hibernate.boot.models.categorize.spi.FilterDefRegistration;
import org.hibernate.boot.models.categorize.xml.internal.XmlDocumentImpl; import org.hibernate.boot.models.xml.internal.XmlDocumentImpl;
import org.hibernate.boot.models.categorize.xml.internal.XmlPreProcessingResultImpl; import org.hibernate.boot.models.xml.internal.XmlPreProcessingResultImpl;
import org.hibernate.boot.models.categorize.xml.spi.PersistenceUnitMetadata; import org.hibernate.boot.models.xml.spi.PersistenceUnitMetadata;
import org.hibernate.models.internal.StringTypeDescriptor; import org.hibernate.models.internal.StringTypeDescriptor;
import org.hibernate.models.spi.ClassDetails; import org.hibernate.models.spi.ClassDetails;
import org.hibernate.models.spi.SourceModelBuildingContext; import org.hibernate.models.spi.SourceModelBuildingContext;
@ -127,7 +127,8 @@ public class XmlProcessingSmokeTests {
final DomainModelCategorizationCollector collector = new DomainModelCategorizationCollector( final DomainModelCategorizationCollector collector = new DomainModelCategorizationCollector(
false, false,
buildingContext.getClassDetailsRegistry(), buildingContext.getClassDetailsRegistry(),
buildingContext.getAnnotationDescriptorRegistry() buildingContext.getAnnotationDescriptorRegistry(),
null
); );
collectedXmlResources.getDocuments().forEach( collector::apply ); collectedXmlResources.getDocuments().forEach( collector::apply );

View File

@ -18,7 +18,7 @@ import org.hibernate.boot.model.process.spi.ManagedResources;
import org.hibernate.boot.internal.AnyKeyType; import org.hibernate.boot.internal.AnyKeyType;
import org.hibernate.boot.models.categorize.spi.CategorizedDomainModel; import org.hibernate.boot.models.categorize.spi.CategorizedDomainModel;
import org.hibernate.boot.models.categorize.spi.EntityHierarchy; import org.hibernate.boot.models.categorize.spi.EntityHierarchy;
import org.hibernate.orm.test.boot.models.ManagedResourcesImpl; import org.hibernate.boot.model.source.internal.annotations.AdditionalManagedResourcesImpl;
import org.hibernate.boot.registry.StandardServiceRegistry; import org.hibernate.boot.registry.StandardServiceRegistry;
import org.hibernate.models.spi.AnnotationUsage; import org.hibernate.models.spi.AnnotationUsage;
import org.hibernate.models.spi.FieldDetails; import org.hibernate.models.spi.FieldDetails;
@ -45,7 +45,7 @@ public class AnyTests {
@SuppressWarnings("JUnitMalformedDeclaration") @SuppressWarnings("JUnitMalformedDeclaration")
void testSimpleAnyAttribute(ServiceRegistryScope scope) { void testSimpleAnyAttribute(ServiceRegistryScope scope) {
final StandardServiceRegistry serviceRegistry = scope.getRegistry(); final StandardServiceRegistry serviceRegistry = scope.getRegistry();
final ManagedResources managedResources = new ManagedResourcesImpl.Builder() final ManagedResources managedResources = new AdditionalManagedResourcesImpl.Builder()
.addLoadedClasses( Entity1.class ) .addLoadedClasses( Entity1.class )
.addLoadedClasses( Entity2.class ) .addLoadedClasses( Entity2.class )
.addXmlMappings( "mappings/models/attr/any/simple.xml" ) .addXmlMappings( "mappings/models/attr/any/simple.xml" )

View File

@ -24,7 +24,7 @@ import org.hibernate.boot.model.process.spi.ManagedResources;
import org.hibernate.boot.models.categorize.spi.CategorizedDomainModel; import org.hibernate.boot.models.categorize.spi.CategorizedDomainModel;
import org.hibernate.boot.models.categorize.spi.EntityHierarchy; import org.hibernate.boot.models.categorize.spi.EntityHierarchy;
import org.hibernate.boot.models.categorize.spi.EntityTypeMetadata; import org.hibernate.boot.models.categorize.spi.EntityTypeMetadata;
import org.hibernate.orm.test.boot.models.ManagedResourcesImpl; import org.hibernate.boot.model.source.internal.annotations.AdditionalManagedResourcesImpl;
import org.hibernate.boot.registry.StandardServiceRegistry; import org.hibernate.boot.registry.StandardServiceRegistry;
import org.hibernate.models.spi.AnnotationUsage; import org.hibernate.models.spi.AnnotationUsage;
import org.hibernate.models.spi.FieldDetails; import org.hibernate.models.spi.FieldDetails;
@ -51,7 +51,7 @@ public class ManyToOneTests {
@SuppressWarnings("JUnitMalformedDeclaration") @SuppressWarnings("JUnitMalformedDeclaration")
void testSimpleManyToOne(ServiceRegistryScope scope) { void testSimpleManyToOne(ServiceRegistryScope scope) {
final StandardServiceRegistry serviceRegistry = scope.getRegistry(); final StandardServiceRegistry serviceRegistry = scope.getRegistry();
final ManagedResources managedResources = new ManagedResourcesImpl.Builder() final ManagedResources managedResources = new AdditionalManagedResourcesImpl.Builder()
.addXmlMappings( "mappings/models/attr/many-to-one/simple.xml" ) .addXmlMappings( "mappings/models/attr/many-to-one/simple.xml" )
.build(); .build();

View File

@ -12,7 +12,7 @@ import org.hibernate.boot.model.process.spi.ManagedResources;
import org.hibernate.boot.models.categorize.spi.CategorizedDomainModel; import org.hibernate.boot.models.categorize.spi.CategorizedDomainModel;
import org.hibernate.boot.models.categorize.spi.EntityHierarchy; import org.hibernate.boot.models.categorize.spi.EntityHierarchy;
import org.hibernate.boot.models.categorize.spi.EntityTypeMetadata; import org.hibernate.boot.models.categorize.spi.EntityTypeMetadata;
import org.hibernate.orm.test.boot.models.ManagedResourcesImpl; import org.hibernate.boot.model.source.internal.annotations.AdditionalManagedResourcesImpl;
import org.hibernate.boot.registry.StandardServiceRegistry; import org.hibernate.boot.registry.StandardServiceRegistry;
import org.hibernate.models.spi.AnnotationUsage; import org.hibernate.models.spi.AnnotationUsage;
import org.hibernate.models.spi.FieldDetails; import org.hibernate.models.spi.FieldDetails;
@ -33,7 +33,7 @@ import static org.hibernate.boot.models.categorize.spi.ManagedResourcesProcessor
public class ColumnTests { public class ColumnTests {
@Test @Test
void testCompleteColumn(ServiceRegistryScope scope) { void testCompleteColumn(ServiceRegistryScope scope) {
final ManagedResources managedResources = new ManagedResourcesImpl.Builder() final ManagedResources managedResources = new AdditionalManagedResourcesImpl.Builder()
.addXmlMappings( "mappings/models/column/complete.xml" ) .addXmlMappings( "mappings/models/column/complete.xml" )
.build(); .build();
final StandardServiceRegistry serviceRegistry = scope.getRegistry(); final StandardServiceRegistry serviceRegistry = scope.getRegistry();
@ -65,7 +65,7 @@ public class ColumnTests {
@Test @Test
void testOverrideColumn(ServiceRegistryScope scope) { void testOverrideColumn(ServiceRegistryScope scope) {
final ManagedResources managedResources = new ManagedResourcesImpl.Builder() final ManagedResources managedResources = new AdditionalManagedResourcesImpl.Builder()
.addXmlMappings( "mappings/models/column/override.xml" ) .addXmlMappings( "mappings/models/column/override.xml" )
.build(); .build();

View File

@ -16,7 +16,7 @@ import org.hibernate.boot.registry.StandardServiceRegistry;
import org.hibernate.boot.registry.StandardServiceRegistryBuilder; import org.hibernate.boot.registry.StandardServiceRegistryBuilder;
import org.hibernate.orm.test.boot.models.BootstrapContextTesting; import org.hibernate.orm.test.boot.models.BootstrapContextTesting;
import org.hibernate.orm.test.boot.models.SourceModelTestHelper; import org.hibernate.orm.test.boot.models.SourceModelTestHelper;
import org.hibernate.orm.test.boot.models.ManagedResourcesImpl; import org.hibernate.boot.model.source.internal.annotations.AdditionalManagedResourcesImpl;
import org.junit.jupiter.api.Test; import org.junit.jupiter.api.Test;
@ -36,7 +36,7 @@ public class CompleteXmlInheritanceTests {
@Test @Test
void testIt() { void testIt() {
final ManagedResourcesImpl.Builder managedResourcesBuilder = new ManagedResourcesImpl.Builder(); final AdditionalManagedResourcesImpl.Builder managedResourcesBuilder = new AdditionalManagedResourcesImpl.Builder();
managedResourcesBuilder.addXmlMappings( "mappings/models/complete/simple-inherited.xml" ); managedResourcesBuilder.addXmlMappings( "mappings/models/complete/simple-inherited.xml" );
final ManagedResources managedResources = managedResourcesBuilder.build(); final ManagedResources managedResources = managedResourcesBuilder.build();

View File

@ -11,9 +11,10 @@ import org.hibernate.boot.internal.MetadataBuilderImpl;
import org.hibernate.boot.model.process.spi.ManagedResources; import org.hibernate.boot.model.process.spi.ManagedResources;
import org.hibernate.boot.models.categorize.spi.AttributeMetadata; import org.hibernate.boot.models.categorize.spi.AttributeMetadata;
import org.hibernate.boot.models.categorize.spi.CategorizedDomainModel; import org.hibernate.boot.models.categorize.spi.CategorizedDomainModel;
import org.hibernate.boot.models.categorize.spi.ClassAttributeAccessType;
import org.hibernate.boot.models.categorize.spi.EntityHierarchy; import org.hibernate.boot.models.categorize.spi.EntityHierarchy;
import org.hibernate.boot.models.categorize.spi.EntityTypeMetadata; import org.hibernate.boot.models.categorize.spi.EntityTypeMetadata;
import org.hibernate.orm.test.boot.models.ManagedResourcesImpl; import org.hibernate.boot.model.source.internal.annotations.AdditionalManagedResourcesImpl;
import org.hibernate.boot.registry.StandardServiceRegistry; import org.hibernate.boot.registry.StandardServiceRegistry;
import org.hibernate.boot.registry.StandardServiceRegistryBuilder; import org.hibernate.boot.registry.StandardServiceRegistryBuilder;
@ -35,7 +36,7 @@ import static org.hibernate.boot.models.categorize.spi.ManagedResourcesProcessor
public class CompleteXmlWithEmbeddableTests { public class CompleteXmlWithEmbeddableTests {
@Test @Test
void testIt() { void testIt() {
final ManagedResourcesImpl.Builder managedResourcesBuilder = new ManagedResourcesImpl.Builder(); final AdditionalManagedResourcesImpl.Builder managedResourcesBuilder = new AdditionalManagedResourcesImpl.Builder();
managedResourcesBuilder.addXmlMappings( "mappings/models/complete/simple-person.xml" ); managedResourcesBuilder.addXmlMappings( "mappings/models/complete/simple-person.xml" );
final ManagedResources managedResources = managedResourcesBuilder.build(); final ManagedResources managedResources = managedResourcesBuilder.build();
@ -53,7 +54,7 @@ public class CompleteXmlWithEmbeddableTests {
final EntityHierarchy hierarchy = categorizedDomainModel.getEntityHierarchies().iterator().next(); final EntityHierarchy hierarchy = categorizedDomainModel.getEntityHierarchies().iterator().next();
final EntityTypeMetadata personMetadata = hierarchy.getRoot(); final EntityTypeMetadata personMetadata = hierarchy.getRoot();
assertThat( personMetadata.getAccessType() ).isEqualTo( AccessType.FIELD ); assertThat( personMetadata.getClassLevelAccessType() ).isEqualTo( ClassAttributeAccessType.EXPLICIT_FIELD );
assertThat( personMetadata.getAttributes() ).hasSize( 2 ); assertThat( personMetadata.getAttributes() ).hasSize( 2 );

View File

@ -16,7 +16,7 @@ import org.hibernate.boot.models.categorize.spi.CategorizedDomainModel;
import org.hibernate.boot.models.categorize.spi.EntityHierarchy; import org.hibernate.boot.models.categorize.spi.EntityHierarchy;
import org.hibernate.boot.models.categorize.spi.EntityTypeMetadata; import org.hibernate.boot.models.categorize.spi.EntityTypeMetadata;
import org.hibernate.boot.models.categorize.spi.IdentifiableTypeMetadata; import org.hibernate.boot.models.categorize.spi.IdentifiableTypeMetadata;
import org.hibernate.orm.test.boot.models.ManagedResourcesImpl; import org.hibernate.boot.model.source.internal.annotations.AdditionalManagedResourcesImpl;
import org.hibernate.boot.registry.StandardServiceRegistry; import org.hibernate.boot.registry.StandardServiceRegistry;
import org.hibernate.boot.registry.StandardServiceRegistryBuilder; import org.hibernate.boot.registry.StandardServiceRegistryBuilder;
import org.hibernate.models.spi.AnnotationUsage; import org.hibernate.models.spi.AnnotationUsage;
@ -33,7 +33,7 @@ import static org.hibernate.boot.models.categorize.spi.ManagedResourcesProcessor
public class DiscriminatorValueTest { public class DiscriminatorValueTest {
@Test @Test
void testDiscriminatorValue() { void testDiscriminatorValue() {
final ManagedResources managedResources = new ManagedResourcesImpl.Builder() final ManagedResources managedResources = new AdditionalManagedResourcesImpl.Builder()
.addXmlMappings( "mappings/models/complete/discriminator-value.xml" ) .addXmlMappings( "mappings/models/complete/discriminator-value.xml" )
.build(); .build();
try (StandardServiceRegistry serviceRegistry = new StandardServiceRegistryBuilder().build()) { try (StandardServiceRegistry serviceRegistry = new StandardServiceRegistryBuilder().build()) {

View File

@ -20,7 +20,7 @@ import org.hibernate.boot.models.categorize.spi.AttributeMetadata;
import org.hibernate.boot.models.categorize.spi.CategorizedDomainModel; import org.hibernate.boot.models.categorize.spi.CategorizedDomainModel;
import org.hibernate.boot.models.categorize.spi.EntityHierarchy; import org.hibernate.boot.models.categorize.spi.EntityHierarchy;
import org.hibernate.boot.models.categorize.spi.EntityTypeMetadata; import org.hibernate.boot.models.categorize.spi.EntityTypeMetadata;
import org.hibernate.orm.test.boot.models.ManagedResourcesImpl; import org.hibernate.boot.model.source.internal.annotations.AdditionalManagedResourcesImpl;
import org.hibernate.orm.test.boot.models.xml.SimpleEntity; import org.hibernate.orm.test.boot.models.xml.SimpleEntity;
import org.hibernate.boot.registry.StandardServiceRegistry; import org.hibernate.boot.registry.StandardServiceRegistry;
import org.hibernate.boot.registry.StandardServiceRegistryBuilder; import org.hibernate.boot.registry.StandardServiceRegistryBuilder;
@ -42,8 +42,7 @@ import static org.hibernate.boot.models.categorize.spi.ManagedResourcesProcessor
public class SimpleCompleteXmlTests { public class SimpleCompleteXmlTests {
@Test @Test
void testSimpleCompleteEntity() { void testSimpleCompleteEntity() {
final AdditionalManagedResourcesImpl.Builder managedResourcesBuilder = new AdditionalManagedResourcesImpl.Builder();
final ManagedResourcesImpl.Builder managedResourcesBuilder = new ManagedResourcesImpl.Builder();
managedResourcesBuilder.addXmlMappings( "mappings/models/complete/simple-complete.xml" ); managedResourcesBuilder.addXmlMappings( "mappings/models/complete/simple-complete.xml" );
final ManagedResources managedResources = managedResourcesBuilder.build(); final ManagedResources managedResources = managedResourcesBuilder.build();

View File

@ -26,7 +26,7 @@ import org.hibernate.boot.model.process.spi.ManagedResources;
import org.hibernate.boot.models.categorize.spi.CategorizedDomainModel; import org.hibernate.boot.models.categorize.spi.CategorizedDomainModel;
import org.hibernate.boot.models.categorize.spi.EntityHierarchy; import org.hibernate.boot.models.categorize.spi.EntityHierarchy;
import org.hibernate.boot.models.categorize.spi.EntityTypeMetadata; import org.hibernate.boot.models.categorize.spi.EntityTypeMetadata;
import org.hibernate.orm.test.boot.models.ManagedResourcesImpl; import org.hibernate.boot.model.source.internal.annotations.AdditionalManagedResourcesImpl;
import org.hibernate.boot.registry.StandardServiceRegistry; import org.hibernate.boot.registry.StandardServiceRegistry;
import org.hibernate.boot.registry.StandardServiceRegistryBuilder; import org.hibernate.boot.registry.StandardServiceRegistryBuilder;
import org.hibernate.models.spi.AnnotationUsage; import org.hibernate.models.spi.AnnotationUsage;
@ -54,7 +54,7 @@ import static org.hibernate.boot.models.categorize.spi.ManagedResourcesProcessor
public class DynamicModelTests { public class DynamicModelTests {
@Test @Test
void testSimpleDynamicModel() { void testSimpleDynamicModel() {
final ManagedResources managedResources = new ManagedResourcesImpl.Builder() final ManagedResources managedResources = new AdditionalManagedResourcesImpl.Builder()
.addXmlMappings( "mappings/models/dynamic/dynamic-simple.xml" ) .addXmlMappings( "mappings/models/dynamic/dynamic-simple.xml" )
.build(); .build();
try (StandardServiceRegistry serviceRegistry = new StandardServiceRegistryBuilder().build()) { try (StandardServiceRegistry serviceRegistry = new StandardServiceRegistryBuilder().build()) {
@ -87,7 +87,7 @@ public class DynamicModelTests {
@Test @Test
void testSemiSimpleDynamicModel() { void testSemiSimpleDynamicModel() {
final ManagedResources managedResources = new ManagedResourcesImpl.Builder() final ManagedResources managedResources = new AdditionalManagedResourcesImpl.Builder()
.addXmlMappings( "mappings/models/dynamic/dynamic-semi-simple.xml" ) .addXmlMappings( "mappings/models/dynamic/dynamic-semi-simple.xml" )
.build(); .build();
try (StandardServiceRegistry serviceRegistry = new StandardServiceRegistryBuilder().build()) { try (StandardServiceRegistry serviceRegistry = new StandardServiceRegistryBuilder().build()) {
@ -134,7 +134,7 @@ public class DynamicModelTests {
@Test @Test
void testIdClass() { void testIdClass() {
final ManagedResources managedResources = new ManagedResourcesImpl.Builder() final ManagedResources managedResources = new AdditionalManagedResourcesImpl.Builder()
.addXmlMappings( "mappings/models/dynamic/dynamic-id-class.xml" ) .addXmlMappings( "mappings/models/dynamic/dynamic-id-class.xml" )
.build(); .build();
try (StandardServiceRegistry serviceRegistry = new StandardServiceRegistryBuilder().build()) { try (StandardServiceRegistry serviceRegistry = new StandardServiceRegistryBuilder().build()) {
@ -161,7 +161,7 @@ public class DynamicModelTests {
@Test @Test
void testOneToMany() { void testOneToMany() {
final ManagedResources managedResources = new ManagedResourcesImpl.Builder() final ManagedResources managedResources = new AdditionalManagedResourcesImpl.Builder()
.addXmlMappings( "mappings/models/dynamic/dynamic-plurals.xml" ) .addXmlMappings( "mappings/models/dynamic/dynamic-plurals.xml" )
.build(); .build();
try (StandardServiceRegistry serviceRegistry = new StandardServiceRegistryBuilder().build()) { try (StandardServiceRegistry serviceRegistry = new StandardServiceRegistryBuilder().build()) {

View File

@ -15,7 +15,7 @@ import org.hibernate.boot.model.process.spi.ManagedResources;
import org.hibernate.boot.models.categorize.spi.CategorizedDomainModel; import org.hibernate.boot.models.categorize.spi.CategorizedDomainModel;
import org.hibernate.boot.models.categorize.spi.EntityHierarchy; import org.hibernate.boot.models.categorize.spi.EntityHierarchy;
import org.hibernate.boot.models.categorize.spi.EntityTypeMetadata; import org.hibernate.boot.models.categorize.spi.EntityTypeMetadata;
import org.hibernate.orm.test.boot.models.ManagedResourcesImpl; import org.hibernate.boot.model.source.internal.annotations.AdditionalManagedResourcesImpl;
import org.hibernate.boot.registry.StandardServiceRegistry; import org.hibernate.boot.registry.StandardServiceRegistry;
import org.hibernate.boot.registry.StandardServiceRegistryBuilder; import org.hibernate.boot.registry.StandardServiceRegistryBuilder;
import org.hibernate.models.spi.AnnotationUsage; import org.hibernate.models.spi.AnnotationUsage;
@ -33,7 +33,7 @@ import static org.hibernate.boot.models.categorize.spi.ManagedResourcesProcessor
public class NamedEntityGraphTest { public class NamedEntityGraphTest {
@Test @Test
void testNamedEntityGraph() { void testNamedEntityGraph() {
final ManagedResources managedResources = new ManagedResourcesImpl.Builder() final ManagedResources managedResources = new AdditionalManagedResourcesImpl.Builder()
.addXmlMappings( "mappings/models/dynamic/dynamic-named-entity-graph.xml" ) .addXmlMappings( "mappings/models/dynamic/dynamic-named-entity-graph.xml" )
.build(); .build();
try (StandardServiceRegistry serviceRegistry = new StandardServiceRegistryBuilder().build()) { try (StandardServiceRegistry serviceRegistry = new StandardServiceRegistryBuilder().build()) {

View File

@ -15,7 +15,7 @@ import org.hibernate.boot.model.process.spi.ManagedResources;
import org.hibernate.boot.models.categorize.spi.CategorizedDomainModel; import org.hibernate.boot.models.categorize.spi.CategorizedDomainModel;
import org.hibernate.boot.models.categorize.spi.EntityHierarchy; import org.hibernate.boot.models.categorize.spi.EntityHierarchy;
import org.hibernate.boot.models.categorize.spi.EntityTypeMetadata; import org.hibernate.boot.models.categorize.spi.EntityTypeMetadata;
import org.hibernate.orm.test.boot.models.ManagedResourcesImpl; import org.hibernate.boot.model.source.internal.annotations.AdditionalManagedResourcesImpl;
import org.hibernate.boot.registry.StandardServiceRegistry; import org.hibernate.boot.registry.StandardServiceRegistry;
import org.hibernate.boot.registry.StandardServiceRegistryBuilder; import org.hibernate.boot.registry.StandardServiceRegistryBuilder;
import org.hibernate.models.spi.AnnotationUsage; import org.hibernate.models.spi.AnnotationUsage;
@ -28,7 +28,7 @@ import static org.hibernate.boot.models.categorize.spi.ManagedResourcesProcessor
public class RowIdTest { public class RowIdTest {
@Test @Test
void testSimpleDynamicModel() { void testSimpleDynamicModel() {
final ManagedResources managedResources = new ManagedResourcesImpl.Builder() final ManagedResources managedResources = new AdditionalManagedResourcesImpl.Builder()
.addXmlMappings( "mappings/models/dynamic/dynamic-rowid.xml" ) .addXmlMappings( "mappings/models/dynamic/dynamic-rowid.xml" )
.build(); .build();
try (StandardServiceRegistry serviceRegistry = new StandardServiceRegistryBuilder().build()) { try (StandardServiceRegistry serviceRegistry = new StandardServiceRegistryBuilder().build()) {

View File

@ -16,7 +16,7 @@ import org.hibernate.boot.model.process.spi.ManagedResources;
import org.hibernate.boot.models.categorize.spi.CategorizedDomainModel; import org.hibernate.boot.models.categorize.spi.CategorizedDomainModel;
import org.hibernate.boot.models.categorize.spi.EntityHierarchy; import org.hibernate.boot.models.categorize.spi.EntityHierarchy;
import org.hibernate.boot.models.categorize.spi.EntityTypeMetadata; import org.hibernate.boot.models.categorize.spi.EntityTypeMetadata;
import org.hibernate.orm.test.boot.models.ManagedResourcesImpl; import org.hibernate.boot.model.source.internal.annotations.AdditionalManagedResourcesImpl;
import org.hibernate.boot.registry.StandardServiceRegistry; import org.hibernate.boot.registry.StandardServiceRegistry;
import org.hibernate.boot.registry.StandardServiceRegistryBuilder; import org.hibernate.boot.registry.StandardServiceRegistryBuilder;
import org.hibernate.models.spi.AnnotationUsage; import org.hibernate.models.spi.AnnotationUsage;
@ -35,7 +35,7 @@ import static org.hibernate.boot.models.categorize.spi.ManagedResourcesProcessor
public class TenantIdTest { public class TenantIdTest {
@Test @Test
void testSimpleDynamicModel() { void testSimpleDynamicModel() {
final ManagedResources managedResources = new ManagedResourcesImpl.Builder() final ManagedResources managedResources = new AdditionalManagedResourcesImpl.Builder()
.addXmlMappings( "mappings/models/dynamic/dynamic-tenantid.xml" ) .addXmlMappings( "mappings/models/dynamic/dynamic-tenantid.xml" )
.build(); .build();
try (StandardServiceRegistry serviceRegistry = new StandardServiceRegistryBuilder().build()) { try (StandardServiceRegistry serviceRegistry = new StandardServiceRegistryBuilder().build()) {

View File

@ -13,7 +13,7 @@ import org.hibernate.boot.internal.MetadataBuilderImpl;
import org.hibernate.boot.model.process.spi.ManagedResources; import org.hibernate.boot.model.process.spi.ManagedResources;
import org.hibernate.boot.models.categorize.spi.CategorizedDomainModel; import org.hibernate.boot.models.categorize.spi.CategorizedDomainModel;
import org.hibernate.boot.models.categorize.spi.JpaEventListener; import org.hibernate.boot.models.categorize.spi.JpaEventListener;
import org.hibernate.orm.test.boot.models.ManagedResourcesImpl; import org.hibernate.boot.model.source.internal.annotations.AdditionalManagedResourcesImpl;
import org.hibernate.boot.registry.StandardServiceRegistry; import org.hibernate.boot.registry.StandardServiceRegistry;
import org.hibernate.boot.registry.StandardServiceRegistryBuilder; import org.hibernate.boot.registry.StandardServiceRegistryBuilder;
import org.hibernate.models.internal.jdk.VoidClassDetails; import org.hibernate.models.internal.jdk.VoidClassDetails;
@ -30,7 +30,7 @@ import static org.hibernate.boot.models.categorize.spi.ManagedResourcesProcessor
public class JpaEventListenerTests { public class JpaEventListenerTests {
@Test @Test
void testGlobalRegistration() { void testGlobalRegistration() {
final ManagedResources managedResources = new ManagedResourcesImpl.Builder() final ManagedResources managedResources = new AdditionalManagedResourcesImpl.Builder()
.addXmlMappings( "mappings/models/globals.xml" ) .addXmlMappings( "mappings/models/globals.xml" )
.build(); .build();

View File

@ -14,7 +14,7 @@ import org.hibernate.boot.internal.MetadataBuilderImpl;
import org.hibernate.boot.model.process.spi.ManagedResources; import org.hibernate.boot.model.process.spi.ManagedResources;
import org.hibernate.boot.models.categorize.spi.CategorizedDomainModel; import org.hibernate.boot.models.categorize.spi.CategorizedDomainModel;
import org.hibernate.boot.models.categorize.spi.EntityTypeMetadata; import org.hibernate.boot.models.categorize.spi.EntityTypeMetadata;
import org.hibernate.orm.test.boot.models.ManagedResourcesImpl; import org.hibernate.boot.model.source.internal.annotations.AdditionalManagedResourcesImpl;
import org.hibernate.orm.test.boot.models.xml.SimpleEntity; import org.hibernate.orm.test.boot.models.xml.SimpleEntity;
import org.hibernate.boot.registry.StandardServiceRegistry; import org.hibernate.boot.registry.StandardServiceRegistry;
import org.hibernate.boot.registry.StandardServiceRegistryBuilder; import org.hibernate.boot.registry.StandardServiceRegistryBuilder;
@ -42,7 +42,7 @@ import static org.hibernate.boot.models.categorize.spi.ManagedResourcesProcessor
public class EntityLifecycleTests { public class EntityLifecycleTests {
@Test @Test
void testEntityLifecycle() { void testEntityLifecycle() {
final ManagedResources managedResources = new ManagedResourcesImpl.Builder() final ManagedResources managedResources = new AdditionalManagedResourcesImpl.Builder()
.addXmlMappings( "mappings/models/lifecycle/entity-lifecycle.xml" ) .addXmlMappings( "mappings/models/lifecycle/entity-lifecycle.xml" )
.build(); .build();
try (StandardServiceRegistry serviceRegistry = new StandardServiceRegistryBuilder().build()) { try (StandardServiceRegistry serviceRegistry = new StandardServiceRegistryBuilder().build()) {

View File

@ -13,7 +13,7 @@ import org.hibernate.boot.models.categorize.spi.AttributeMetadata;
import org.hibernate.boot.models.categorize.spi.CategorizedDomainModel; import org.hibernate.boot.models.categorize.spi.CategorizedDomainModel;
import org.hibernate.boot.models.categorize.spi.EntityHierarchy; import org.hibernate.boot.models.categorize.spi.EntityHierarchy;
import org.hibernate.boot.models.categorize.spi.EntityTypeMetadata; import org.hibernate.boot.models.categorize.spi.EntityTypeMetadata;
import org.hibernate.orm.test.boot.models.ManagedResourcesImpl; import org.hibernate.boot.model.source.internal.annotations.AdditionalManagedResourcesImpl;
import org.hibernate.orm.test.boot.models.xml.SimpleEntity; import org.hibernate.orm.test.boot.models.xml.SimpleEntity;
import org.hibernate.boot.registry.StandardServiceRegistry; import org.hibernate.boot.registry.StandardServiceRegistry;
import org.hibernate.boot.registry.StandardServiceRegistryBuilder; import org.hibernate.boot.registry.StandardServiceRegistryBuilder;
@ -35,7 +35,7 @@ public class SimpleOverrideXmlTests {
@Test @Test
void testSimpleCompleteEntity() { void testSimpleCompleteEntity() {
final ManagedResourcesImpl.Builder managedResourcesBuilder = new ManagedResourcesImpl.Builder(); final AdditionalManagedResourcesImpl.Builder managedResourcesBuilder = new AdditionalManagedResourcesImpl.Builder();
managedResourcesBuilder.addXmlMappings( "mappings/models/override/simple-override.xml" ); managedResourcesBuilder.addXmlMappings( "mappings/models/override/simple-override.xml" );
final ManagedResources managedResources = managedResourcesBuilder.build(); final ManagedResources managedResources = managedResourcesBuilder.build();

View File

@ -12,7 +12,6 @@ import jakarta.persistence.Lob;
@Entity @Entity
public class GenericCompositeUserTypeEntity { public class GenericCompositeUserTypeEntity {
@Lob
@Embedded @Embedded
@CompositeType(value = EnumPlaceholderUserType.class) @CompositeType(value = EnumPlaceholderUserType.class)
@AttributeOverrides({ @AttributeOverrides({

View File

@ -1,9 +1,9 @@
package org.hibernate.orm.test.entitygraph.parser; package org.hibernate.orm.test.entitygraph.parser;
import java.util.Map; import java.util.Map;
import jakarta.persistence.Basic; import jakarta.persistence.Basic;
import jakarta.persistence.CascadeType; import jakarta.persistence.CascadeType;
import jakarta.persistence.ElementCollection;
import jakarta.persistence.Entity; import jakarta.persistence.Entity;
import jakarta.persistence.FetchType; import jakarta.persistence.FetchType;
import jakarta.persistence.Id; import jakarta.persistence.Id;
@ -61,7 +61,6 @@ public class GraphParsingTestEntity {
} }
@OneToMany(cascade = CascadeType.ALL, fetch = FetchType.EAGER) @OneToMany(cascade = CascadeType.ALL, fetch = FetchType.EAGER)
@ElementCollection(targetClass = GraphParsingTestEntity.class)
public Map<GraphParsingTestEntity, GraphParsingTestEntity> getMap() { public Map<GraphParsingTestEntity, GraphParsingTestEntity> getMap() {
return map; return map;
} }

View File

@ -1,9 +1,9 @@
package org.hibernate.orm.test.graph; package org.hibernate.orm.test.graph;
import java.util.Map; import java.util.Map;
import jakarta.persistence.Basic; import jakarta.persistence.Basic;
import jakarta.persistence.CascadeType; import jakarta.persistence.CascadeType;
import jakarta.persistence.ElementCollection;
import jakarta.persistence.Entity; import jakarta.persistence.Entity;
import jakarta.persistence.FetchType; import jakarta.persistence.FetchType;
import jakarta.persistence.Id; import jakarta.persistence.Id;
@ -61,7 +61,6 @@ public class GraphParsingTestEntity {
} }
@OneToMany(cascade = CascadeType.ALL, fetch = FetchType.EAGER) @OneToMany(cascade = CascadeType.ALL, fetch = FetchType.EAGER)
@ElementCollection(targetClass = GraphParsingTestEntity.class)
public Map<GraphParsingTestEntity, GraphParsingTestEntity> getMap() { public Map<GraphParsingTestEntity, GraphParsingTestEntity> getMap() {
return map; return map;
} }

View File

@ -6,6 +6,8 @@
*/ */
package org.hibernate.orm.test.proxy; package org.hibernate.orm.test.proxy;
import jakarta.persistence.Access;
import jakarta.persistence.AccessType;
import jakarta.persistence.Column; import jakarta.persistence.Column;
import jakarta.persistence.Entity; import jakarta.persistence.Entity;
import jakarta.persistence.Id; import jakarta.persistence.Id;
@ -70,9 +72,11 @@ public class MissingSetterWithEnhancementTest {
} }
@Entity @Entity
@Access(AccessType.PROPERTY)
public static class EntityWithMissingSetter { public static class EntityWithMissingSetter {
private Long id; private Long id;
@Column @Column
@Access(AccessType.FIELD)
private int someInt; private int someInt;
@Id @Id

Some files were not shown because too many files have changed in this diff Show More