diff --git a/src/main/java/com/mongodb/hibernate/dialect/MongoDialect.java b/src/main/java/com/mongodb/hibernate/dialect/MongoDialect.java index c10ceb31..5154919c 100644 --- a/src/main/java/com/mongodb/hibernate/dialect/MongoDialect.java +++ b/src/main/java/com/mongodb/hibernate/dialect/MongoDialect.java @@ -46,6 +46,6 @@ protected DatabaseVersion getMinimumSupportedVersion() { @Override public SqlAstTranslatorFactory getSqlAstTranslatorFactory() { - return new MongoTranslatorFactory(); + return MongoTranslatorFactory.INSTANCE; } } diff --git a/src/main/java/com/mongodb/hibernate/internal/extension/MongoAdditionalMappingContributor.java b/src/main/java/com/mongodb/hibernate/internal/extension/MongoAdditionalMappingContributor.java index 668a394a..f63f28c8 100644 --- a/src/main/java/com/mongodb/hibernate/internal/extension/MongoAdditionalMappingContributor.java +++ b/src/main/java/com/mongodb/hibernate/internal/extension/MongoAdditionalMappingContributor.java @@ -23,13 +23,22 @@ import com.mongodb.hibernate.internal.FeatureNotSupportedException; import org.hibernate.annotations.DynamicInsert; +import org.hibernate.boot.Metadata; +import org.hibernate.boot.MetadataSources; import org.hibernate.boot.ResourceStreamLocator; +import org.hibernate.boot.registry.BootstrapServiceRegistry; import org.hibernate.boot.spi.AdditionalMappingContributions; import org.hibernate.boot.spi.AdditionalMappingContributor; import org.hibernate.boot.spi.InFlightMetadataCollector; import org.hibernate.boot.spi.MetadataBuildingContext; import org.hibernate.mapping.PersistentClass; +/** + * The instance methods like {@link #getContributorName()}, {@link #contribute(AdditionalMappingContributions, + * InFlightMetadataCollector, ResourceStreamLocator, MetadataBuildingContext)} are called multiple times if multiple + * {@link Metadata} instances are {@linkplain MetadataSources#buildMetadata() built} using the same + * {@link BootstrapServiceRegistry}. + */ public final class MongoAdditionalMappingContributor implements AdditionalMappingContributor { public MongoAdditionalMappingContributor() {} diff --git a/src/main/java/com/mongodb/hibernate/internal/extension/service/StandardServiceRegistryScopedState.java b/src/main/java/com/mongodb/hibernate/internal/extension/service/StandardServiceRegistryScopedState.java index c14cc5ad..93e569fd 100644 --- a/src/main/java/com/mongodb/hibernate/internal/extension/service/StandardServiceRegistryScopedState.java +++ b/src/main/java/com/mongodb/hibernate/internal/extension/service/StandardServiceRegistryScopedState.java @@ -27,7 +27,9 @@ import java.io.Serial; import java.util.Map; import org.hibernate.HibernateException; +import org.hibernate.boot.registry.BootstrapServiceRegistry; import org.hibernate.boot.registry.StandardServiceInitiator; +import org.hibernate.boot.registry.StandardServiceRegistry; import org.hibernate.boot.registry.StandardServiceRegistryBuilder; import org.hibernate.service.Service; import org.hibernate.service.UnknownServiceException; @@ -49,6 +51,11 @@ public MongoConfiguration getConfiguration() { return config; } + /** + * The instance methods like {@link #contribute(StandardServiceRegistryBuilder)} are called multiple times if + * multiple {@link StandardServiceRegistry} instances are {@linkplain StandardServiceRegistryBuilder#build() built} + * using the same {@link BootstrapServiceRegistry}. + */ public static final class ServiceContributor implements org.hibernate.service.spi.ServiceContributor { public ServiceContributor() {} diff --git a/src/main/java/com/mongodb/hibernate/internal/translate/MongoTranslatorFactory.java b/src/main/java/com/mongodb/hibernate/internal/translate/MongoTranslatorFactory.java index 9a1a87fe..d445366d 100644 --- a/src/main/java/com/mongodb/hibernate/internal/translate/MongoTranslatorFactory.java +++ b/src/main/java/com/mongodb/hibernate/internal/translate/MongoTranslatorFactory.java @@ -26,7 +26,14 @@ import org.hibernate.sql.model.ast.TableMutation; import org.hibernate.sql.model.jdbc.JdbcMutationOperation; +/** + * Tread-safe. + */ public final class MongoTranslatorFactory implements SqlAstTranslatorFactory { + public static MongoTranslatorFactory INSTANCE = new MongoTranslatorFactory(); + + private MongoTranslatorFactory() {} + @Override public SqlAstTranslator buildSelectTranslator( SessionFactoryImplementor sessionFactoryImplementor, SelectStatement selectStatement) {