From 87000100a07d098464664b03bbe19e8c08aad40e Mon Sep 17 00:00:00 2001 From: Valentin Kovalenko Date: Wed, 19 Nov 2025 00:24:22 -0700 Subject: [PATCH 1/6] Make mongo-hibernate.jar a Java module HIBERNATE-52 --- build.gradle.kts | 28 +++++++++++---- gradle/libs.versions.toml | 4 +-- .../query/AbstractQueryIntegrationTests.java | 4 +-- ...imitOffsetFetchClauseIntegrationTests.java | 4 +-- .../hibernate/cfg/MongoConfigurator.java | 5 ++- .../hibernate/dialect/MongoDialect.java | 7 ++-- .../mongodb/hibernate/internal/Sealed.java | 36 ------------------- .../internal/dialect/TestMongoDialect.java | 26 ++++++++++++++ .../jdbc/MongoPreparedStatement.java | 20 +++++------ .../hibernate/jdbc/MongoStatement.java | 15 ++++---- src/main/java/module-info.java | 15 ++++++++ 11 files changed, 90 insertions(+), 74 deletions(-) delete mode 100644 src/main/java/com/mongodb/hibernate/internal/Sealed.java create mode 100644 src/main/java/com/mongodb/hibernate/internal/dialect/TestMongoDialect.java create mode 100644 src/main/java/module-info.java diff --git a/build.gradle.kts b/build.gradle.kts index 2c179807..674fbfba 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -39,20 +39,28 @@ java { } tasks.withType { - exclude("/com/mongodb/hibernate/internal/**") - exclude("com/mongodb/hibernate/dialect/**") - exclude("com/mongodb/hibernate/jdbc/**") - val standardDocletOptions = options as StandardJavadocDocletOptions standardDocletOptions.apply { + addBooleanOption("Werror", false) + // TODO-HIBERNATE-129 addStringOption("-link-modularity-mismatch", "info") + addBooleanOption("serialwarn", true) + addBooleanOption("Xdoclint:all", true) + addBooleanOption( + "Xdoclint/package:-" + + "com.mongodb.hibernate.internal.*" + + ",com.mongodb.hibernate.dialect.*" + + ",com.mongodb.hibernate.jdbc.*", + true) + addStringOption("-show-module-contents", "api") + addStringOption("-show-packages", "exported") + addStringOption("-show-types", "protected") author(true) version(true) - encoding = "UTF-8" + encoding("UTF-8") charSet("UTF-8") docEncoding("UTF-8") addBooleanOption("html5", true) addBooleanOption("-allow-script-in-comments", true) - // TODO-HIBERNATE-129 addStringOption("-link-modularity-mismatch", "info") links = listOf( "https://docs.oracle.com/en/java/javase/17/docs/api/", @@ -141,11 +149,15 @@ spotless { tasks.check { dependsOn(tasks.spotlessApply) } tasks.withType().configureEach { - options.compilerArgs.addAll(listOf("-Xlint:all", "-Werror")) + options.compilerArgs.addAll( + listOf("-Xlint:all", "-Xlint:-requires-automatic", "-Xlint:-requires-transitive-automatic", "-Werror")) when (this) { tasks.compileJava.get() -> options.errorprone { disableWarningsInGeneratedCode = true + // Error Prone does not understand the `@hidden` standard tag + disable("InvalidBlockTag") + disable("AssignmentExpression") option("NullAway:AnnotatedPackages", "com.mongodb.hibernate") error("NullAway") } @@ -159,6 +171,8 @@ tasks.withType().configureEach { buildConfig { useJavaOutput() packageName("com.mongodb.hibernate.internal") + documentation.set( + "Generated by the BuildConfig plugin.\n\n@hidden") buildConfigField("NAME", provider { project.name }) buildConfigField("VERSION", provider { "${project.version}" }) } diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index 54fc15b6..38309aa5 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -15,7 +15,7 @@ [versions] junit-jupiter = "5.13.4" assertj = "3.27.3" -google-errorprone-core = "2.36.0" +google-errorprone-core = "2.42.0" nullaway = "0.12.4" jspecify = "1.0.0" hibernate-orm = "6.6.34.Final" # Remember to update javadoc links @@ -27,7 +27,7 @@ mockito = "5.16.0" checker-qual = "3.49.1" plugin-spotless = "7.0.2" -plugin-errorprone = "4.1.0" +plugin-errorprone = "4.3.0" plugin-buildconfig = "5.5.4" plugin-palantir = "2.58.0" plugin-ktfmt = "0.54" diff --git a/src/integrationTest/java/com/mongodb/hibernate/query/AbstractQueryIntegrationTests.java b/src/integrationTest/java/com/mongodb/hibernate/query/AbstractQueryIntegrationTests.java index b8aa009e..f3001d37 100644 --- a/src/integrationTest/java/com/mongodb/hibernate/query/AbstractQueryIntegrationTests.java +++ b/src/integrationTest/java/com/mongodb/hibernate/query/AbstractQueryIntegrationTests.java @@ -26,7 +26,7 @@ import com.mongodb.client.MongoCollection; import com.mongodb.hibernate.TestCommandListener; -import com.mongodb.hibernate.dialect.MongoDialect; +import com.mongodb.hibernate.internal.dialect.TestMongoDialect; import com.mongodb.hibernate.junit.MongoExtension; import java.util.Set; import java.util.function.Consumer; @@ -251,7 +251,7 @@ private void assertAffectedCollections(Set expectedAffectedCollections) .containsExactlyInAnyOrderElementsOf(expectedAffectedCollections); } - protected static final class TranslateResultAwareDialect extends MongoDialect { + protected static final class TranslateResultAwareDialect extends TestMongoDialect { private AbstractJdbcOperationQuery capturedTranslateResult; public TranslateResultAwareDialect(DialectResolutionInfo info) { diff --git a/src/integrationTest/java/com/mongodb/hibernate/query/select/LimitOffsetFetchClauseIntegrationTests.java b/src/integrationTest/java/com/mongodb/hibernate/query/select/LimitOffsetFetchClauseIntegrationTests.java index 54bba000..a327e7bc 100644 --- a/src/integrationTest/java/com/mongodb/hibernate/query/select/LimitOffsetFetchClauseIntegrationTests.java +++ b/src/integrationTest/java/com/mongodb/hibernate/query/select/LimitOffsetFetchClauseIntegrationTests.java @@ -23,9 +23,9 @@ import static org.hibernate.cfg.AvailableSettings.QUERY_PLAN_CACHE_ENABLED; import static org.junit.jupiter.params.provider.EnumSource.Mode.EXCLUDE; -import com.mongodb.hibernate.dialect.MongoDialect; import com.mongodb.hibernate.internal.FeatureNotSupportedException; import com.mongodb.hibernate.internal.MongoConstants; +import com.mongodb.hibernate.internal.dialect.TestMongoDialect; import com.mongodb.hibernate.query.AbstractQueryIntegrationTests; import com.mongodb.hibernate.query.Book; import java.util.Arrays; @@ -625,7 +625,7 @@ private void setQueryOptionsAndQuery( * the query plan cache is hit, not whether {@link SqlAstTranslator} is reused afterwards (e.g., incompatible * {@link org.hibernate.query.spi.QueryOptions QueryOptions}s will end up with new translator bing created). */ - protected static final class TranslatingCacheTestingDialect extends MongoDialect { + protected static final class TranslatingCacheTestingDialect extends TestMongoDialect { private final AtomicInteger selectTranslatingCounter = new AtomicInteger(); public TranslatingCacheTestingDialect(DialectResolutionInfo info) { diff --git a/src/main/java/com/mongodb/hibernate/cfg/MongoConfigurator.java b/src/main/java/com/mongodb/hibernate/cfg/MongoConfigurator.java index ae5d67cc..1c225eaf 100644 --- a/src/main/java/com/mongodb/hibernate/cfg/MongoConfigurator.java +++ b/src/main/java/com/mongodb/hibernate/cfg/MongoConfigurator.java @@ -18,7 +18,7 @@ import com.mongodb.ConnectionString; import com.mongodb.MongoClientSettings; -import com.mongodb.hibernate.internal.Sealed; +import com.mongodb.hibernate.internal.cfg.MongoConfigurationBuilder; import com.mongodb.hibernate.service.spi.MongoConfigurationContributor; import java.util.Map; import java.util.function.Consumer; @@ -74,8 +74,7 @@ * * @see MongoConfigurationContributor */ -@Sealed -public interface MongoConfigurator { +public sealed interface MongoConfigurator permits MongoConfigurationBuilder { /** * Configures {@link MongoClientSettings}. * diff --git a/src/main/java/com/mongodb/hibernate/dialect/MongoDialect.java b/src/main/java/com/mongodb/hibernate/dialect/MongoDialect.java index 184b25b4..fcf1cb3a 100644 --- a/src/main/java/com/mongodb/hibernate/dialect/MongoDialect.java +++ b/src/main/java/com/mongodb/hibernate/dialect/MongoDialect.java @@ -20,8 +20,8 @@ import static java.lang.String.format; import com.mongodb.hibernate.internal.FeatureNotSupportedException; -import com.mongodb.hibernate.internal.Sealed; import com.mongodb.hibernate.internal.dialect.MongoAggregateSupport; +import com.mongodb.hibernate.internal.dialect.TestMongoDialect; import com.mongodb.hibernate.internal.dialect.function.array.MongoArrayConstructorFunction; import com.mongodb.hibernate.internal.dialect.function.array.MongoArrayContainsFunction; import com.mongodb.hibernate.internal.dialect.function.array.MongoArrayIncludesFunction; @@ -152,8 +152,7 @@ * href="https://docs.jboss.org/hibernate/orm/6.6/userguide/html_single/Hibernate_User_Guide.html#hql-exp-functions">HQL * functions see {@link #initializeFunctionRegistry(FunctionContributions)}. */ -@Sealed -public class MongoDialect extends Dialect { +public sealed class MongoDialect extends Dialect permits TestMongoDialect { private static final DatabaseVersion MINIMUM_VERSION = DatabaseVersion.make(7); public MongoDialect(DialectResolutionInfo info) { @@ -168,7 +167,7 @@ public MongoDialect(DialectResolutionInfo info) { * {@link MongoDialect#MongoDialect(DialectResolutionInfo)} fails. * @throws RuntimeException Always. */ - @Deprecated() + @Deprecated public MongoDialect() { throw new RuntimeException(format( "Could not instantiate [%s], see the earlier exceptions to find out why", diff --git a/src/main/java/com/mongodb/hibernate/internal/Sealed.java b/src/main/java/com/mongodb/hibernate/internal/Sealed.java deleted file mode 100644 index 3730442c..00000000 --- a/src/main/java/com/mongodb/hibernate/internal/Sealed.java +++ /dev/null @@ -1,36 +0,0 @@ -/* - * Copyright 2024-present MongoDB, Inc. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.mongodb.hibernate.internal; - -import java.lang.annotation.Documented; -import java.lang.annotation.ElementType; -import java.lang.annotation.Retention; -import java.lang.annotation.RetentionPolicy; -import java.lang.annotation.Target; - -/** - * Signifies that the annotated class or interface should be treated as sealed: it must not be extended or implemented - * by consumers of the library. Using such classes and interfaces is no different from using ordinary unannotated - * classes and interfaces. - */ -// TODO-HIBERNATE-52 The `permits` interface/class must be located in the same package as the `sealed` interface/class, -// unless they are in the same named module. Once we modularize, we should be able to use `sealed` instead of this -// annotation. -@Retention(RetentionPolicy.CLASS) -@Target(ElementType.TYPE) -@Documented -public @interface Sealed {} diff --git a/src/main/java/com/mongodb/hibernate/internal/dialect/TestMongoDialect.java b/src/main/java/com/mongodb/hibernate/internal/dialect/TestMongoDialect.java new file mode 100644 index 00000000..a4776fc6 --- /dev/null +++ b/src/main/java/com/mongodb/hibernate/internal/dialect/TestMongoDialect.java @@ -0,0 +1,26 @@ +/* + * Copyright 2024-present MongoDB, Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.mongodb.hibernate.internal.dialect; + +import com.mongodb.hibernate.dialect.MongoDialect; +import org.hibernate.engine.jdbc.dialect.spi.DialectResolutionInfo; + +public abstract non-sealed class TestMongoDialect extends MongoDialect { + protected TestMongoDialect(DialectResolutionInfo info) { + super(info); + } +} diff --git a/src/main/java/com/mongodb/hibernate/jdbc/MongoPreparedStatement.java b/src/main/java/com/mongodb/hibernate/jdbc/MongoPreparedStatement.java index b7e49ce9..317f9512 100644 --- a/src/main/java/com/mongodb/hibernate/jdbc/MongoPreparedStatement.java +++ b/src/main/java/com/mongodb/hibernate/jdbc/MongoPreparedStatement.java @@ -96,16 +96,16 @@ public void setNull(int parameterIndex, int sqlType) throws SQLException { checkClosed(); checkParameterIndex(parameterIndex); switch (sqlType) { - case Types.BLOB: - case Types.CLOB: - case Types.DATALINK: - case Types.NCHAR: - case Types.NCLOB: - case Types.NVARCHAR: - case Types.LONGNVARCHAR: - case Types.REF: - case Types.ROWID: - case Types.SQLXML: + case Types.BLOB, + Types.CLOB, + Types.DATALINK, + Types.NCHAR, + Types.NCLOB, + Types.NVARCHAR, + Types.LONGNVARCHAR, + Types.REF, + Types.ROWID, + Types.SQLXML -> throw new SQLFeatureNotSupportedException( "Unsupported SQL type: " + JDBCType.valueOf(sqlType).getName()); } diff --git a/src/main/java/com/mongodb/hibernate/jdbc/MongoStatement.java b/src/main/java/com/mongodb/hibernate/jdbc/MongoStatement.java index 754f6fdf..f282df9b 100644 --- a/src/main/java/com/mongodb/hibernate/jdbc/MongoStatement.java +++ b/src/main/java/com/mongodb/hibernate/jdbc/MongoStatement.java @@ -524,29 +524,28 @@ static void convertToWriteModels( throws SQLFeatureNotSupportedException, SQLSyntaxErrorException { try { switch (commandDescription) { - case INSERT: + case INSERT -> { checkCommandFields(command, commandDescription, SUPPORTED_INSERT_COMMAND_FIELDS); var documentsToInsert = command.getArray("documents"); for (var documentToInsert : documentsToInsert) { writeModels.add(createInsertModel(documentToInsert.asDocument())); } - break; - case UPDATE: + } + case UPDATE -> { checkCommandFields(command, commandDescription, SUPPORTED_UPDATE_COMMAND_FIELDS); var updateStatements = command.getArray("updates"); for (var updateStatement : updateStatements) { writeModels.add(createUpdateModel(updateStatement.asDocument(), commandDescription)); } - break; - case DELETE: + } + case DELETE -> { checkCommandFields(command, commandDescription, SUPPORTED_DELETE_COMMAND_FIELDS); var deleteStatements = command.getArray("deletes"); for (var deleteStatement : deleteStatements) { writeModels.add(createDeleteModel(deleteStatement.asDocument(), commandDescription)); } - break; - default: - throw fail(commandDescription.toString()); + } + default -> throw fail(commandDescription.toString()); } } catch (BSONException bsonException) { throw createSyntaxErrorException("%s: [%s]", command, bsonException); diff --git a/src/main/java/module-info.java b/src/main/java/module-info.java new file mode 100644 index 00000000..8282b5b7 --- /dev/null +++ b/src/main/java/module-info.java @@ -0,0 +1,15 @@ +/** The MongoDB Extension for Hibernate ORM module. */ +module com.mongodb.hibernate { + requires java.naming; + requires java.sql; + requires jakarta.persistence; + requires transitive org.hibernate.orm.core; + requires org.mongodb.bson; + requires transitive org.mongodb.driver.core; + requires org.mongodb.driver.sync.client; + requires org.jspecify; + + exports com.mongodb.hibernate.annotations; + exports com.mongodb.hibernate.cfg; + exports com.mongodb.hibernate.service.spi; +} From 7b850d224fa8c985d12100e3b275ca2e6fca39f9 Mon Sep 17 00:00:00 2001 From: Valentin Kovalenko Date: Wed, 19 Nov 2025 23:12:09 -0700 Subject: [PATCH 2/6] Hide `public`/`protected` internal classes from the generated API documentation HIBERNATE-52 --- .../hibernate/internal/FeatureNotSupportedException.java | 2 ++ .../com/mongodb/hibernate/internal/MongoAssertions.java | 6 +++++- .../java/com/mongodb/hibernate/internal/MongoChecks.java | 6 +++++- .../com/mongodb/hibernate/internal/MongoConstants.java | 2 ++ .../com/mongodb/hibernate/internal/VisibleForTesting.java | 4 ++++ .../hibernate/internal/cfg/MongoConfiguration.java | 1 + .../hibernate/internal/cfg/MongoConfigurationBuilder.java | 2 ++ .../hibernate/internal/dialect/MongoAggregateSupport.java | 2 ++ .../hibernate/internal/dialect/TestMongoDialect.java | 2 ++ .../function/array/MongoArrayConstructorFunction.java | 2 ++ .../function/array/MongoArrayContainsFunction.java | 2 ++ .../function/array/MongoArrayIncludesFunction.java | 2 ++ .../extension/MongoAdditionalMappingContributor.java | 2 ++ .../service/StandardServiceRegistryScopedState.java | 3 +++ .../hibernate/internal/id/objectid/ObjectIdGenerator.java | 1 + .../com/mongodb/hibernate/internal/jdbc/MongoArray.java | 2 ++ .../internal/translate/AbstractMqlTranslator.java | 2 ++ .../internal/translate/AstVisitorValueDescriptor.java | 3 ++- .../internal/translate/MongoTranslatorFactory.java | 2 ++ .../hibernate/internal/translate/mongoast/AstArray.java | 2 ++ .../internal/translate/mongoast/AstDocument.java | 6 +++++- .../hibernate/internal/translate/mongoast/AstElement.java | 5 ++++- .../internal/translate/mongoast/AstFieldUpdate.java | 5 ++++- .../hibernate/internal/translate/mongoast/AstLiteral.java | 2 ++ .../hibernate/internal/translate/mongoast/AstNode.java | 2 ++ .../internal/translate/mongoast/AstParameterMarker.java | 5 ++++- .../hibernate/internal/translate/mongoast/AstValue.java | 2 ++ .../internal/translate/mongoast/command/AstCommand.java | 6 +++++- .../translate/mongoast/command/AstDeleteCommand.java | 6 +++++- .../translate/mongoast/command/AstInsertCommand.java | 6 +++++- .../translate/mongoast/command/AstUpdateCommand.java | 6 +++++- .../mongoast/command/aggregate/AstAggregateCommand.java | 6 +++++- .../mongoast/command/aggregate/AstLimitStage.java | 6 +++++- .../mongoast/command/aggregate/AstMatchStage.java | 6 +++++- .../mongoast/command/aggregate/AstProjectStage.java | 6 +++++- .../aggregate/AstProjectStageIncludeSpecification.java | 2 ++ .../command/aggregate/AstProjectStageSpecification.java | 5 ++++- .../mongoast/command/aggregate/AstSkipStage.java | 6 +++++- .../mongoast/command/aggregate/AstSortField.java | 5 ++++- .../mongoast/command/aggregate/AstSortOrder.java | 5 ++++- .../mongoast/command/aggregate/AstSortStage.java | 6 +++++- .../translate/mongoast/command/aggregate/AstStage.java | 2 ++ .../translate/mongoast/filter/AstAllFilterOperation.java | 7 +++++-- .../mongoast/filter/AstComparisonFilterOperation.java | 2 ++ .../mongoast/filter/AstComparisonFilterOperator.java | 5 ++++- .../translate/mongoast/filter/AstEmptyFilter.java | 2 ++ .../mongoast/filter/AstFieldOperationFilter.java | 1 + .../internal/translate/mongoast/filter/AstFilter.java | 2 ++ .../translate/mongoast/filter/AstFilterOperation.java | 5 ++++- .../translate/mongoast/filter/AstLogicalFilter.java | 2 ++ .../mongoast/filter/AstLogicalFilterOperator.java | 5 ++++- .../translate/mongoast/filter/AstTypeFilterOperation.java | 6 +++++- .../hibernate/internal/type/MongoArrayJdbcType.java | 8 +++++++- .../hibernate/internal/type/MongoStructJdbcType.java | 6 +++++- .../mongodb/hibernate/internal/type/ObjectIdJavaType.java | 6 +++++- .../mongodb/hibernate/internal/type/ObjectIdJdbcType.java | 6 +++++- .../mongodb/hibernate/internal/type/ValueConversions.java | 2 ++ 57 files changed, 191 insertions(+), 30 deletions(-) diff --git a/src/main/java/com/mongodb/hibernate/internal/FeatureNotSupportedException.java b/src/main/java/com/mongodb/hibernate/internal/FeatureNotSupportedException.java index dc63e46a..c473da65 100644 --- a/src/main/java/com/mongodb/hibernate/internal/FeatureNotSupportedException.java +++ b/src/main/java/com/mongodb/hibernate/internal/FeatureNotSupportedException.java @@ -19,6 +19,8 @@ import java.io.Serial; import java.sql.SQLFeatureNotSupportedException; +/** @hidden */ +@SuppressWarnings("MissingSummary") public final class FeatureNotSupportedException extends RuntimeException { @Serial diff --git a/src/main/java/com/mongodb/hibernate/internal/MongoAssertions.java b/src/main/java/com/mongodb/hibernate/internal/MongoAssertions.java index e992043f..31d760fe 100644 --- a/src/main/java/com/mongodb/hibernate/internal/MongoAssertions.java +++ b/src/main/java/com/mongodb/hibernate/internal/MongoAssertions.java @@ -18,7 +18,11 @@ import org.jspecify.annotations.Nullable; -/** Util class for various assertion purposes. */ +/** + * Util class for various assertion purposes. + * + * @hidden + */ public final class MongoAssertions { private MongoAssertions() {} diff --git a/src/main/java/com/mongodb/hibernate/internal/MongoChecks.java b/src/main/java/com/mongodb/hibernate/internal/MongoChecks.java index 8048a5d0..8b2697ee 100644 --- a/src/main/java/com/mongodb/hibernate/internal/MongoChecks.java +++ b/src/main/java/com/mongodb/hibernate/internal/MongoChecks.java @@ -20,7 +20,11 @@ import org.jspecify.annotations.Nullable; -/** Util class for checking, for example, argument values. */ +/** + * Util class for checking, for example, argument values. + * + * @hidden + */ public final class MongoChecks { private MongoChecks() {} diff --git a/src/main/java/com/mongodb/hibernate/internal/MongoConstants.java b/src/main/java/com/mongodb/hibernate/internal/MongoConstants.java index 1e37e5e8..74393279 100644 --- a/src/main/java/com/mongodb/hibernate/internal/MongoConstants.java +++ b/src/main/java/com/mongodb/hibernate/internal/MongoConstants.java @@ -19,6 +19,8 @@ import org.bson.json.JsonMode; import org.bson.json.JsonWriterSettings; +/** @hidden */ +@SuppressWarnings("MissingSummary") public final class MongoConstants { private MongoConstants() {} diff --git a/src/main/java/com/mongodb/hibernate/internal/VisibleForTesting.java b/src/main/java/com/mongodb/hibernate/internal/VisibleForTesting.java index 9a8610df..54a5e16e 100644 --- a/src/main/java/com/mongodb/hibernate/internal/VisibleForTesting.java +++ b/src/main/java/com/mongodb/hibernate/internal/VisibleForTesting.java @@ -26,6 +26,8 @@ * Denotes that the annotated program element is made more accessible than otherwise necessary for the purpose of * testing. The annotated program element must be used as if it had the {@linkplain #otherwise() intended} access * modifier for any purpose other than testing. + * + * @hidden */ @Documented @Retention(RetentionPolicy.SOURCE) @@ -33,6 +35,8 @@ public @interface VisibleForTesting { VisibleForTesting.AccessModifier otherwise(); + /** @hidden */ + @SuppressWarnings("MissingSummary") enum AccessModifier { PRIVATE, PACKAGE, diff --git a/src/main/java/com/mongodb/hibernate/internal/cfg/MongoConfiguration.java b/src/main/java/com/mongodb/hibernate/internal/cfg/MongoConfiguration.java index 6b4e3e1c..820be942 100644 --- a/src/main/java/com/mongodb/hibernate/internal/cfg/MongoConfiguration.java +++ b/src/main/java/com/mongodb/hibernate/internal/cfg/MongoConfiguration.java @@ -26,5 +26,6 @@ * @param mongoClientSettings {@link MongoConfigurator#applyToMongoClientSettings(Consumer)}. * @param databaseName {@link MongoConfigurator#databaseName(String)}. * @see MongoConfigurationBuilder#build() + * @hidden */ public record MongoConfiguration(MongoClientSettings mongoClientSettings, String databaseName) {} diff --git a/src/main/java/com/mongodb/hibernate/internal/cfg/MongoConfigurationBuilder.java b/src/main/java/com/mongodb/hibernate/internal/cfg/MongoConfigurationBuilder.java index 2982ac38..2e0aab82 100644 --- a/src/main/java/com/mongodb/hibernate/internal/cfg/MongoConfigurationBuilder.java +++ b/src/main/java/com/mongodb/hibernate/internal/cfg/MongoConfigurationBuilder.java @@ -33,6 +33,8 @@ import java.util.stream.Collectors; import org.jspecify.annotations.Nullable; +/** @hidden */ +@SuppressWarnings("MissingSummary") public final class MongoConfigurationBuilder implements MongoConfigurator { private final MongoClientSettings.Builder mongoClientSettingsBuilder; private @Nullable String databaseName; diff --git a/src/main/java/com/mongodb/hibernate/internal/dialect/MongoAggregateSupport.java b/src/main/java/com/mongodb/hibernate/internal/dialect/MongoAggregateSupport.java index 53af28c8..5385c5f7 100644 --- a/src/main/java/com/mongodb/hibernate/internal/dialect/MongoAggregateSupport.java +++ b/src/main/java/com/mongodb/hibernate/internal/dialect/MongoAggregateSupport.java @@ -25,6 +25,8 @@ import org.hibernate.mapping.AggregateColumn; import org.hibernate.mapping.Column; +/** @hidden */ +@SuppressWarnings("MissingSummary") public final class MongoAggregateSupport extends AggregateSupportImpl { public static final MongoAggregateSupport INSTANCE = new MongoAggregateSupport(); public static final String UNSUPPORTED_MESSAGE_PREFIX = diff --git a/src/main/java/com/mongodb/hibernate/internal/dialect/TestMongoDialect.java b/src/main/java/com/mongodb/hibernate/internal/dialect/TestMongoDialect.java index a4776fc6..e64b071b 100644 --- a/src/main/java/com/mongodb/hibernate/internal/dialect/TestMongoDialect.java +++ b/src/main/java/com/mongodb/hibernate/internal/dialect/TestMongoDialect.java @@ -19,6 +19,8 @@ import com.mongodb.hibernate.dialect.MongoDialect; import org.hibernate.engine.jdbc.dialect.spi.DialectResolutionInfo; +/** @hidden */ +@SuppressWarnings("MissingSummary") public abstract non-sealed class TestMongoDialect extends MongoDialect { protected TestMongoDialect(DialectResolutionInfo info) { super(info); diff --git a/src/main/java/com/mongodb/hibernate/internal/dialect/function/array/MongoArrayConstructorFunction.java b/src/main/java/com/mongodb/hibernate/internal/dialect/function/array/MongoArrayConstructorFunction.java index 5418a9bd..0e8b4d08 100644 --- a/src/main/java/com/mongodb/hibernate/internal/dialect/function/array/MongoArrayConstructorFunction.java +++ b/src/main/java/com/mongodb/hibernate/internal/dialect/function/array/MongoArrayConstructorFunction.java @@ -34,6 +34,8 @@ * {@code array}, {@code array_list}. * *

Thread-safe. + * + * @hidden */ public final class MongoArrayConstructorFunction extends ArrayConstructorFunction { static final Set NAMES = Set.of("array", "array_list"); diff --git a/src/main/java/com/mongodb/hibernate/internal/dialect/function/array/MongoArrayContainsFunction.java b/src/main/java/com/mongodb/hibernate/internal/dialect/function/array/MongoArrayContainsFunction.java index a513a54f..6675edac 100644 --- a/src/main/java/com/mongodb/hibernate/internal/dialect/function/array/MongoArrayContainsFunction.java +++ b/src/main/java/com/mongodb/hibernate/internal/dialect/function/array/MongoArrayContainsFunction.java @@ -56,6 +56,8 @@ *

See Query an Array. * *

Thread-safe. + * + * @hidden */ public final class MongoArrayContainsFunction extends AbstractArrayContainsFunction { public MongoArrayContainsFunction(boolean nullable, TypeConfiguration typeConfiguration) { diff --git a/src/main/java/com/mongodb/hibernate/internal/dialect/function/array/MongoArrayIncludesFunction.java b/src/main/java/com/mongodb/hibernate/internal/dialect/function/array/MongoArrayIncludesFunction.java index 4da26e54..f0fd407f 100644 --- a/src/main/java/com/mongodb/hibernate/internal/dialect/function/array/MongoArrayIncludesFunction.java +++ b/src/main/java/com/mongodb/hibernate/internal/dialect/function/array/MongoArrayIncludesFunction.java @@ -49,6 +49,8 @@ *

See Query an Array. * *

Thread-safe. + * + * @hidden */ public final class MongoArrayIncludesFunction extends AbstractArrayIncludesFunction { public MongoArrayIncludesFunction(boolean nullable, TypeConfiguration typeConfiguration) { 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 1d475b6b..62dd5588 100644 --- a/src/main/java/com/mongodb/hibernate/internal/extension/MongoAdditionalMappingContributor.java +++ b/src/main/java/com/mongodb/hibernate/internal/extension/MongoAdditionalMappingContributor.java @@ -50,6 +50,8 @@ import org.hibernate.type.BasicPluralType; import org.hibernate.type.ComponentType; +/** @hidden */ +@SuppressWarnings("MissingSummary") public final class MongoAdditionalMappingContributor implements AdditionalMappingContributor { /** * We do not support these characters because BSON fields with names containing them must be handled specially as 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 01d0adf0..57718fb8 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 @@ -40,6 +40,8 @@ import org.hibernate.service.spi.ServiceRegistryImplementor; import org.jspecify.annotations.Nullable; +/** @hidden */ +@SuppressWarnings("MissingSummary") public final class StandardServiceRegistryScopedState implements Service { @Serial private static final long serialVersionUID = 1L; @@ -61,6 +63,7 @@ private void writeObject(ObjectOutputStream out) throws IOException { "This class is not designed to be serialized despite it having to implement `Serializable`"); } + /** @hidden */ public static final class ServiceContributor implements org.hibernate.service.spi.ServiceContributor { public ServiceContributor() {} diff --git a/src/main/java/com/mongodb/hibernate/internal/id/objectid/ObjectIdGenerator.java b/src/main/java/com/mongodb/hibernate/internal/id/objectid/ObjectIdGenerator.java index f56d63e1..5f2266f6 100644 --- a/src/main/java/com/mongodb/hibernate/internal/id/objectid/ObjectIdGenerator.java +++ b/src/main/java/com/mongodb/hibernate/internal/id/objectid/ObjectIdGenerator.java @@ -32,6 +32,7 @@ * Tread-safe. * * @see com.mongodb.hibernate.annotations.ObjectIdGenerator + * @hidden */ public final class ObjectIdGenerator implements BeforeExecutionGenerator { @Serial diff --git a/src/main/java/com/mongodb/hibernate/internal/jdbc/MongoArray.java b/src/main/java/com/mongodb/hibernate/internal/jdbc/MongoArray.java index fc816f1a..b4985f71 100644 --- a/src/main/java/com/mongodb/hibernate/internal/jdbc/MongoArray.java +++ b/src/main/java/com/mongodb/hibernate/internal/jdbc/MongoArray.java @@ -16,6 +16,8 @@ package com.mongodb.hibernate.internal.jdbc; +/** @hidden */ +@SuppressWarnings("MissingSummary") public final class MongoArray implements ArrayAdapter { private final Object contents; diff --git a/src/main/java/com/mongodb/hibernate/internal/translate/AbstractMqlTranslator.java b/src/main/java/com/mongodb/hibernate/internal/translate/AbstractMqlTranslator.java index 6bfb898d..89472c0d 100644 --- a/src/main/java/com/mongodb/hibernate/internal/translate/AbstractMqlTranslator.java +++ b/src/main/java/com/mongodb/hibernate/internal/translate/AbstractMqlTranslator.java @@ -201,6 +201,8 @@ import org.hibernate.type.BasicType; import org.jspecify.annotations.Nullable; +/** @hidden */ +@SuppressWarnings("MissingSummary") public abstract class AbstractMqlTranslator implements SqlAstTranslator { private final SessionFactoryImplementor sessionFactory; diff --git a/src/main/java/com/mongodb/hibernate/internal/translate/AstVisitorValueDescriptor.java b/src/main/java/com/mongodb/hibernate/internal/translate/AstVisitorValueDescriptor.java index 557e0b32..e5199d28 100644 --- a/src/main/java/com/mongodb/hibernate/internal/translate/AstVisitorValueDescriptor.java +++ b/src/main/java/com/mongodb/hibernate/internal/translate/AstVisitorValueDescriptor.java @@ -30,7 +30,8 @@ import java.util.Map; import org.hibernate.sql.ast.tree.expression.Expression; -@SuppressWarnings("UnusedTypeParameter") +/** @hidden */ +@SuppressWarnings({"MissingSummary", "UnusedTypeParameter"}) public final class AstVisitorValueDescriptor { static final AstVisitorValueDescriptor MODEL_MUTATION_RESULT = 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 e596b89e..f82f9ac1 100644 --- a/src/main/java/com/mongodb/hibernate/internal/translate/MongoTranslatorFactory.java +++ b/src/main/java/com/mongodb/hibernate/internal/translate/MongoTranslatorFactory.java @@ -26,6 +26,8 @@ import org.hibernate.sql.model.ast.TableMutation; import org.hibernate.sql.model.jdbc.JdbcMutationOperation; +/** @hidden */ +@SuppressWarnings("MissingSummary") public final class MongoTranslatorFactory implements SqlAstTranslatorFactory { @Override public SqlAstTranslator buildSelectTranslator( diff --git a/src/main/java/com/mongodb/hibernate/internal/translate/mongoast/AstArray.java b/src/main/java/com/mongodb/hibernate/internal/translate/mongoast/AstArray.java index 4f93c9a9..ee8440a9 100644 --- a/src/main/java/com/mongodb/hibernate/internal/translate/mongoast/AstArray.java +++ b/src/main/java/com/mongodb/hibernate/internal/translate/mongoast/AstArray.java @@ -19,6 +19,8 @@ import java.util.Collection; import org.bson.BsonWriter; +/** @hidden */ +@SuppressWarnings("MissingSummary") public record AstArray(Collection elements) implements AstValue { @Override public void render(BsonWriter writer) { diff --git a/src/main/java/com/mongodb/hibernate/internal/translate/mongoast/AstDocument.java b/src/main/java/com/mongodb/hibernate/internal/translate/mongoast/AstDocument.java index e18acff3..eca0cd8f 100644 --- a/src/main/java/com/mongodb/hibernate/internal/translate/mongoast/AstDocument.java +++ b/src/main/java/com/mongodb/hibernate/internal/translate/mongoast/AstDocument.java @@ -19,7 +19,11 @@ import java.util.Collection; import org.bson.BsonWriter; -/** See Documents. */ +/** + * See Documents. + * + * @hidden + */ public record AstDocument(Collection elements) implements AstValue { @Override public void render(BsonWriter writer) { diff --git a/src/main/java/com/mongodb/hibernate/internal/translate/mongoast/AstElement.java b/src/main/java/com/mongodb/hibernate/internal/translate/mongoast/AstElement.java index 0def409a..5b40d01c 100644 --- a/src/main/java/com/mongodb/hibernate/internal/translate/mongoast/AstElement.java +++ b/src/main/java/com/mongodb/hibernate/internal/translate/mongoast/AstElement.java @@ -18,7 +18,10 @@ import org.bson.BsonWriter; -/** @see AstDocument */ +/** + * @see AstDocument + * @hidden + */ @SuppressWarnings("MissingSummary") public record AstElement(String name, AstValue value) implements AstNode { @Override diff --git a/src/main/java/com/mongodb/hibernate/internal/translate/mongoast/AstFieldUpdate.java b/src/main/java/com/mongodb/hibernate/internal/translate/mongoast/AstFieldUpdate.java index 1957e36c..925e9011 100644 --- a/src/main/java/com/mongodb/hibernate/internal/translate/mongoast/AstFieldUpdate.java +++ b/src/main/java/com/mongodb/hibernate/internal/translate/mongoast/AstFieldUpdate.java @@ -18,7 +18,10 @@ import org.bson.BsonWriter; -/** @see com.mongodb.hibernate.internal.translate.mongoast.command.AstUpdateCommand */ +/** + * @see com.mongodb.hibernate.internal.translate.mongoast.command.AstUpdateCommand + * @hidden + */ @SuppressWarnings("MissingSummary") public record AstFieldUpdate(String name, AstValue value) implements AstNode { @Override diff --git a/src/main/java/com/mongodb/hibernate/internal/translate/mongoast/AstLiteral.java b/src/main/java/com/mongodb/hibernate/internal/translate/mongoast/AstLiteral.java index 47781a41..fd4f46f2 100644 --- a/src/main/java/com/mongodb/hibernate/internal/translate/mongoast/AstLiteral.java +++ b/src/main/java/com/mongodb/hibernate/internal/translate/mongoast/AstLiteral.java @@ -22,6 +22,8 @@ import org.bson.codecs.BsonValueCodec; import org.bson.codecs.EncoderContext; +/** @hidden */ +@SuppressWarnings("MissingSummary") public record AstLiteral(BsonValue literalValue) implements AstValue { private static final BsonValueCodec BSON_VALUE_CODEC = new BsonValueCodec(); diff --git a/src/main/java/com/mongodb/hibernate/internal/translate/mongoast/AstNode.java b/src/main/java/com/mongodb/hibernate/internal/translate/mongoast/AstNode.java index 01056839..30b023fe 100644 --- a/src/main/java/com/mongodb/hibernate/internal/translate/mongoast/AstNode.java +++ b/src/main/java/com/mongodb/hibernate/internal/translate/mongoast/AstNode.java @@ -18,6 +18,8 @@ import org.bson.BsonWriter; +/** @hidden */ +@SuppressWarnings("MissingSummary") public interface AstNode { void render(BsonWriter writer); } diff --git a/src/main/java/com/mongodb/hibernate/internal/translate/mongoast/AstParameterMarker.java b/src/main/java/com/mongodb/hibernate/internal/translate/mongoast/AstParameterMarker.java index 0c420686..641f8743 100644 --- a/src/main/java/com/mongodb/hibernate/internal/translate/mongoast/AstParameterMarker.java +++ b/src/main/java/com/mongodb/hibernate/internal/translate/mongoast/AstParameterMarker.java @@ -18,7 +18,10 @@ import org.bson.BsonWriter; -/** @see org.hibernate.cfg.AvailableSettings#DIALECT_NATIVE_PARAM_MARKERS */ +/** + * @see org.hibernate.cfg.AvailableSettings#DIALECT_NATIVE_PARAM_MARKERS + * @hidden + */ @SuppressWarnings("MissingSummary") public final class AstParameterMarker implements AstValue { diff --git a/src/main/java/com/mongodb/hibernate/internal/translate/mongoast/AstValue.java b/src/main/java/com/mongodb/hibernate/internal/translate/mongoast/AstValue.java index dbd7aca9..9f266d52 100644 --- a/src/main/java/com/mongodb/hibernate/internal/translate/mongoast/AstValue.java +++ b/src/main/java/com/mongodb/hibernate/internal/translate/mongoast/AstValue.java @@ -16,4 +16,6 @@ package com.mongodb.hibernate.internal.translate.mongoast; +/** @hidden */ +@SuppressWarnings("MissingSummary") public interface AstValue extends AstNode {} diff --git a/src/main/java/com/mongodb/hibernate/internal/translate/mongoast/command/AstCommand.java b/src/main/java/com/mongodb/hibernate/internal/translate/mongoast/command/AstCommand.java index 5cd524b0..9948252f 100644 --- a/src/main/java/com/mongodb/hibernate/internal/translate/mongoast/command/AstCommand.java +++ b/src/main/java/com/mongodb/hibernate/internal/translate/mongoast/command/AstCommand.java @@ -18,5 +18,9 @@ import com.mongodb.hibernate.internal.translate.mongoast.AstNode; -/** See Database Commands. */ +/** + * See Database Commands. + * + * @hidden + */ public interface AstCommand extends AstNode {} diff --git a/src/main/java/com/mongodb/hibernate/internal/translate/mongoast/command/AstDeleteCommand.java b/src/main/java/com/mongodb/hibernate/internal/translate/mongoast/command/AstDeleteCommand.java index 0770db17..a3fa7f2e 100644 --- a/src/main/java/com/mongodb/hibernate/internal/translate/mongoast/command/AstDeleteCommand.java +++ b/src/main/java/com/mongodb/hibernate/internal/translate/mongoast/command/AstDeleteCommand.java @@ -19,7 +19,11 @@ import com.mongodb.hibernate.internal.translate.mongoast.filter.AstFilter; import org.bson.BsonWriter; -/** See {@code delete}. */ +/** + * See {@code delete}. + * + * @hidden + */ public record AstDeleteCommand(String collection, AstFilter filter) implements AstCommand { @Override public void render(BsonWriter writer) { diff --git a/src/main/java/com/mongodb/hibernate/internal/translate/mongoast/command/AstInsertCommand.java b/src/main/java/com/mongodb/hibernate/internal/translate/mongoast/command/AstInsertCommand.java index 314bbbe7..2053e8b6 100644 --- a/src/main/java/com/mongodb/hibernate/internal/translate/mongoast/command/AstInsertCommand.java +++ b/src/main/java/com/mongodb/hibernate/internal/translate/mongoast/command/AstInsertCommand.java @@ -22,7 +22,11 @@ import java.util.Collection; import org.bson.BsonWriter; -/** See {@code insert}. */ +/** + * See {@code insert}. + * + * @hidden + */ public record AstInsertCommand(String collection, Collection documents) implements AstCommand { public AstInsertCommand { diff --git a/src/main/java/com/mongodb/hibernate/internal/translate/mongoast/command/AstUpdateCommand.java b/src/main/java/com/mongodb/hibernate/internal/translate/mongoast/command/AstUpdateCommand.java index 7ec882e1..3a3bf615 100644 --- a/src/main/java/com/mongodb/hibernate/internal/translate/mongoast/command/AstUpdateCommand.java +++ b/src/main/java/com/mongodb/hibernate/internal/translate/mongoast/command/AstUpdateCommand.java @@ -21,7 +21,11 @@ import java.util.Collection; import org.bson.BsonWriter; -/** See {@code update}. */ +/** + * See {@code update}. + * + * @hidden + */ @SuppressWarnings("InvalidParam") public record AstUpdateCommand(String collection, AstFilter filter, Collection updates) implements AstCommand { diff --git a/src/main/java/com/mongodb/hibernate/internal/translate/mongoast/command/aggregate/AstAggregateCommand.java b/src/main/java/com/mongodb/hibernate/internal/translate/mongoast/command/aggregate/AstAggregateCommand.java index c4cebaac..8fd6b51c 100644 --- a/src/main/java/com/mongodb/hibernate/internal/translate/mongoast/command/aggregate/AstAggregateCommand.java +++ b/src/main/java/com/mongodb/hibernate/internal/translate/mongoast/command/aggregate/AstAggregateCommand.java @@ -20,7 +20,11 @@ import java.util.Collection; import org.bson.BsonWriter; -/** See {@code aggregate}. */ +/** + * See {@code aggregate}. + * + * @hidden + */ public record AstAggregateCommand(String collection, Collection stages) implements AstCommand { @Override diff --git a/src/main/java/com/mongodb/hibernate/internal/translate/mongoast/command/aggregate/AstLimitStage.java b/src/main/java/com/mongodb/hibernate/internal/translate/mongoast/command/aggregate/AstLimitStage.java index 73f69eae..7f372892 100644 --- a/src/main/java/com/mongodb/hibernate/internal/translate/mongoast/command/aggregate/AstLimitStage.java +++ b/src/main/java/com/mongodb/hibernate/internal/translate/mongoast/command/aggregate/AstLimitStage.java @@ -19,7 +19,11 @@ import com.mongodb.hibernate.internal.translate.mongoast.AstValue; import org.bson.BsonWriter; -/** See {@code limit}. */ +/** + * See {@code limit}. + * + * @hidden + */ public record AstLimitStage(AstValue value) implements AstStage { @Override public void render(BsonWriter writer) { diff --git a/src/main/java/com/mongodb/hibernate/internal/translate/mongoast/command/aggregate/AstMatchStage.java b/src/main/java/com/mongodb/hibernate/internal/translate/mongoast/command/aggregate/AstMatchStage.java index 8a6ba461..f3c009ee 100644 --- a/src/main/java/com/mongodb/hibernate/internal/translate/mongoast/command/aggregate/AstMatchStage.java +++ b/src/main/java/com/mongodb/hibernate/internal/translate/mongoast/command/aggregate/AstMatchStage.java @@ -19,7 +19,11 @@ import com.mongodb.hibernate.internal.translate.mongoast.filter.AstFilter; import org.bson.BsonWriter; -/** See {@code $match}. */ +/** + * See {@code $match}. + * + * @hidden + */ public record AstMatchStage(AstFilter filter) implements AstStage { @Override public void render(BsonWriter writer) { diff --git a/src/main/java/com/mongodb/hibernate/internal/translate/mongoast/command/aggregate/AstProjectStage.java b/src/main/java/com/mongodb/hibernate/internal/translate/mongoast/command/aggregate/AstProjectStage.java index 8ca00b68..77c805f8 100644 --- a/src/main/java/com/mongodb/hibernate/internal/translate/mongoast/command/aggregate/AstProjectStage.java +++ b/src/main/java/com/mongodb/hibernate/internal/translate/mongoast/command/aggregate/AstProjectStage.java @@ -21,7 +21,11 @@ import java.util.Collection; import org.bson.BsonWriter; -/** See {@code project}. */ +/** + * See {@code project}. + * + * @hidden + */ public record AstProjectStage(Collection specifications) implements AstStage { public AstProjectStage { diff --git a/src/main/java/com/mongodb/hibernate/internal/translate/mongoast/command/aggregate/AstProjectStageIncludeSpecification.java b/src/main/java/com/mongodb/hibernate/internal/translate/mongoast/command/aggregate/AstProjectStageIncludeSpecification.java index b5acdcce..a10c881d 100644 --- a/src/main/java/com/mongodb/hibernate/internal/translate/mongoast/command/aggregate/AstProjectStageIncludeSpecification.java +++ b/src/main/java/com/mongodb/hibernate/internal/translate/mongoast/command/aggregate/AstProjectStageIncludeSpecification.java @@ -18,6 +18,8 @@ import org.bson.BsonWriter; +/** @hidden */ +@SuppressWarnings("MissingSummary") public record AstProjectStageIncludeSpecification(String field) implements AstProjectStageSpecification { @Override public void render(BsonWriter writer) { diff --git a/src/main/java/com/mongodb/hibernate/internal/translate/mongoast/command/aggregate/AstProjectStageSpecification.java b/src/main/java/com/mongodb/hibernate/internal/translate/mongoast/command/aggregate/AstProjectStageSpecification.java index 4e2d80b8..8967eed0 100644 --- a/src/main/java/com/mongodb/hibernate/internal/translate/mongoast/command/aggregate/AstProjectStageSpecification.java +++ b/src/main/java/com/mongodb/hibernate/internal/translate/mongoast/command/aggregate/AstProjectStageSpecification.java @@ -18,6 +18,9 @@ import com.mongodb.hibernate.internal.translate.mongoast.AstNode; -/** @see AstProjectStage */ +/** + * @see AstProjectStage + * @hidden + */ @SuppressWarnings("MissingSummary") public interface AstProjectStageSpecification extends AstNode {} diff --git a/src/main/java/com/mongodb/hibernate/internal/translate/mongoast/command/aggregate/AstSkipStage.java b/src/main/java/com/mongodb/hibernate/internal/translate/mongoast/command/aggregate/AstSkipStage.java index 13381ebe..b2e6a6f6 100644 --- a/src/main/java/com/mongodb/hibernate/internal/translate/mongoast/command/aggregate/AstSkipStage.java +++ b/src/main/java/com/mongodb/hibernate/internal/translate/mongoast/command/aggregate/AstSkipStage.java @@ -19,7 +19,11 @@ import com.mongodb.hibernate.internal.translate.mongoast.AstValue; import org.bson.BsonWriter; -/** See {@code $skip}. */ +/** + * See {@code $skip}. + * + * @hidden + */ public record AstSkipStage(AstValue value) implements AstStage { @Override public void render(BsonWriter writer) { diff --git a/src/main/java/com/mongodb/hibernate/internal/translate/mongoast/command/aggregate/AstSortField.java b/src/main/java/com/mongodb/hibernate/internal/translate/mongoast/command/aggregate/AstSortField.java index bc913461..ca78da65 100644 --- a/src/main/java/com/mongodb/hibernate/internal/translate/mongoast/command/aggregate/AstSortField.java +++ b/src/main/java/com/mongodb/hibernate/internal/translate/mongoast/command/aggregate/AstSortField.java @@ -19,7 +19,10 @@ import com.mongodb.hibernate.internal.translate.mongoast.AstNode; import org.bson.BsonWriter; -/** @see AstSortStage */ +/** + * @see AstSortStage + * @hidden + */ @SuppressWarnings("MissingSummary") public record AstSortField(String path, AstSortOrder order) implements AstNode { @Override diff --git a/src/main/java/com/mongodb/hibernate/internal/translate/mongoast/command/aggregate/AstSortOrder.java b/src/main/java/com/mongodb/hibernate/internal/translate/mongoast/command/aggregate/AstSortOrder.java index eb18451f..6ba6cf0f 100644 --- a/src/main/java/com/mongodb/hibernate/internal/translate/mongoast/command/aggregate/AstSortOrder.java +++ b/src/main/java/com/mongodb/hibernate/internal/translate/mongoast/command/aggregate/AstSortOrder.java @@ -19,7 +19,10 @@ import com.mongodb.hibernate.internal.translate.mongoast.AstNode; import org.bson.BsonWriter; -/** @see AstSortField */ +/** + * @see AstSortField + * @hidden + */ @SuppressWarnings("MissingSummary") public enum AstSortOrder implements AstNode { ASC(1), diff --git a/src/main/java/com/mongodb/hibernate/internal/translate/mongoast/command/aggregate/AstSortStage.java b/src/main/java/com/mongodb/hibernate/internal/translate/mongoast/command/aggregate/AstSortStage.java index 51da3bc3..3b94e507 100644 --- a/src/main/java/com/mongodb/hibernate/internal/translate/mongoast/command/aggregate/AstSortStage.java +++ b/src/main/java/com/mongodb/hibernate/internal/translate/mongoast/command/aggregate/AstSortStage.java @@ -21,7 +21,11 @@ import java.util.Collection; import org.bson.BsonWriter; -/** See {@code $sort}. */ +/** + * See {@code $sort}. + * + * @hidden + */ public record AstSortStage(Collection sortFields) implements AstStage { public AstSortStage { diff --git a/src/main/java/com/mongodb/hibernate/internal/translate/mongoast/command/aggregate/AstStage.java b/src/main/java/com/mongodb/hibernate/internal/translate/mongoast/command/aggregate/AstStage.java index b649214c..d684522b 100644 --- a/src/main/java/com/mongodb/hibernate/internal/translate/mongoast/command/aggregate/AstStage.java +++ b/src/main/java/com/mongodb/hibernate/internal/translate/mongoast/command/aggregate/AstStage.java @@ -20,5 +20,7 @@ /** * See Aggregation Stages. + * + * @hidden */ public interface AstStage extends AstNode {} diff --git a/src/main/java/com/mongodb/hibernate/internal/translate/mongoast/filter/AstAllFilterOperation.java b/src/main/java/com/mongodb/hibernate/internal/translate/mongoast/filter/AstAllFilterOperation.java index 757b7da4..c16bf1db 100644 --- a/src/main/java/com/mongodb/hibernate/internal/translate/mongoast/filter/AstAllFilterOperation.java +++ b/src/main/java/com/mongodb/hibernate/internal/translate/mongoast/filter/AstAllFilterOperation.java @@ -23,8 +23,11 @@ import com.mongodb.hibernate.internal.translate.mongoast.AstValue; import org.bson.BsonWriter; -/** See {@code $all}. */ -@SuppressWarnings("MissingSummary") +/** + * See {@code $all}. + * + * @hidden + */ public record AstAllFilterOperation(AstValue parameterMarkerOrArrayValue) implements AstFilterOperation { public AstAllFilterOperation { assertTrue(parameterMarkerOrArrayValue instanceof AstParameterMarker diff --git a/src/main/java/com/mongodb/hibernate/internal/translate/mongoast/filter/AstComparisonFilterOperation.java b/src/main/java/com/mongodb/hibernate/internal/translate/mongoast/filter/AstComparisonFilterOperation.java index cce5ac61..c2743f38 100644 --- a/src/main/java/com/mongodb/hibernate/internal/translate/mongoast/filter/AstComparisonFilterOperation.java +++ b/src/main/java/com/mongodb/hibernate/internal/translate/mongoast/filter/AstComparisonFilterOperation.java @@ -22,6 +22,8 @@ /** * See Query and Projection * Operators. Query Selectors. Comparison. + * + * @hidden */ public record AstComparisonFilterOperation(AstComparisonFilterOperator operator, AstValue value) implements AstFilterOperation { diff --git a/src/main/java/com/mongodb/hibernate/internal/translate/mongoast/filter/AstComparisonFilterOperator.java b/src/main/java/com/mongodb/hibernate/internal/translate/mongoast/filter/AstComparisonFilterOperator.java index 507aa64c..79e3fb9e 100644 --- a/src/main/java/com/mongodb/hibernate/internal/translate/mongoast/filter/AstComparisonFilterOperator.java +++ b/src/main/java/com/mongodb/hibernate/internal/translate/mongoast/filter/AstComparisonFilterOperator.java @@ -16,7 +16,10 @@ package com.mongodb.hibernate.internal.translate.mongoast.filter; -/** @see AstComparisonFilterOperation */ +/** + * @see AstComparisonFilterOperation + * @hidden + */ @SuppressWarnings("MissingSummary") public enum AstComparisonFilterOperator { /** See {@code $eq}. */ diff --git a/src/main/java/com/mongodb/hibernate/internal/translate/mongoast/filter/AstEmptyFilter.java b/src/main/java/com/mongodb/hibernate/internal/translate/mongoast/filter/AstEmptyFilter.java index c166a301..a869b389 100644 --- a/src/main/java/com/mongodb/hibernate/internal/translate/mongoast/filter/AstEmptyFilter.java +++ b/src/main/java/com/mongodb/hibernate/internal/translate/mongoast/filter/AstEmptyFilter.java @@ -22,6 +22,8 @@ * Matches all documents. * *

{@link AstFieldOperationFilter} is used for specifying a concrete filter to match documents. + * + * @hidden */ public final class AstEmptyFilter implements AstFilter { public static final AstEmptyFilter INSTANCE = new AstEmptyFilter(); diff --git a/src/main/java/com/mongodb/hibernate/internal/translate/mongoast/filter/AstFieldOperationFilter.java b/src/main/java/com/mongodb/hibernate/internal/translate/mongoast/filter/AstFieldOperationFilter.java index cfa36cd9..b0eda5ca 100644 --- a/src/main/java/com/mongodb/hibernate/internal/translate/mongoast/filter/AstFieldOperationFilter.java +++ b/src/main/java/com/mongodb/hibernate/internal/translate/mongoast/filter/AstFieldOperationFilter.java @@ -23,6 +23,7 @@ * Query Documents. * * @see AstEmptyFilter + * @hidden */ public record AstFieldOperationFilter(String fieldPath, AstFilterOperation filterOperation) implements AstFilter { @Override diff --git a/src/main/java/com/mongodb/hibernate/internal/translate/mongoast/filter/AstFilter.java b/src/main/java/com/mongodb/hibernate/internal/translate/mongoast/filter/AstFilter.java index d013100d..ca3ca01b 100644 --- a/src/main/java/com/mongodb/hibernate/internal/translate/mongoast/filter/AstFilter.java +++ b/src/main/java/com/mongodb/hibernate/internal/translate/mongoast/filter/AstFilter.java @@ -18,4 +18,6 @@ import com.mongodb.hibernate.internal.translate.mongoast.AstNode; +/** @hidden */ +@SuppressWarnings("MissingSummary") public interface AstFilter extends AstNode {} diff --git a/src/main/java/com/mongodb/hibernate/internal/translate/mongoast/filter/AstFilterOperation.java b/src/main/java/com/mongodb/hibernate/internal/translate/mongoast/filter/AstFilterOperation.java index 60ca2409..f94f8060 100644 --- a/src/main/java/com/mongodb/hibernate/internal/translate/mongoast/filter/AstFilterOperation.java +++ b/src/main/java/com/mongodb/hibernate/internal/translate/mongoast/filter/AstFilterOperation.java @@ -18,6 +18,9 @@ import com.mongodb.hibernate.internal.translate.mongoast.AstNode; -/** @see AstFieldOperationFilter */ +/** + * @see AstFieldOperationFilter + * @hidden + */ @SuppressWarnings("MissingSummary") interface AstFilterOperation extends AstNode {} diff --git a/src/main/java/com/mongodb/hibernate/internal/translate/mongoast/filter/AstLogicalFilter.java b/src/main/java/com/mongodb/hibernate/internal/translate/mongoast/filter/AstLogicalFilter.java index 48ed5cee..55d2186c 100644 --- a/src/main/java/com/mongodb/hibernate/internal/translate/mongoast/filter/AstLogicalFilter.java +++ b/src/main/java/com/mongodb/hibernate/internal/translate/mongoast/filter/AstLogicalFilter.java @@ -24,6 +24,8 @@ /** * See Query and Projection Operators. * Query Selectors. Logical. + * + * @hidden */ public record AstLogicalFilter(AstLogicalFilterOperator operator, Collection filters) implements AstFilter { diff --git a/src/main/java/com/mongodb/hibernate/internal/translate/mongoast/filter/AstLogicalFilterOperator.java b/src/main/java/com/mongodb/hibernate/internal/translate/mongoast/filter/AstLogicalFilterOperator.java index 1dc7d94f..a8082e1a 100644 --- a/src/main/java/com/mongodb/hibernate/internal/translate/mongoast/filter/AstLogicalFilterOperator.java +++ b/src/main/java/com/mongodb/hibernate/internal/translate/mongoast/filter/AstLogicalFilterOperator.java @@ -16,7 +16,10 @@ package com.mongodb.hibernate.internal.translate.mongoast.filter; -/** @see AstLogicalFilter */ +/** + * @see AstLogicalFilter + * @hidden + */ @SuppressWarnings("MissingSummary") public enum AstLogicalFilterOperator { /** See {@code $and}. */ diff --git a/src/main/java/com/mongodb/hibernate/internal/translate/mongoast/filter/AstTypeFilterOperation.java b/src/main/java/com/mongodb/hibernate/internal/translate/mongoast/filter/AstTypeFilterOperation.java index 7a6a7afd..30f00f04 100644 --- a/src/main/java/com/mongodb/hibernate/internal/translate/mongoast/filter/AstTypeFilterOperation.java +++ b/src/main/java/com/mongodb/hibernate/internal/translate/mongoast/filter/AstTypeFilterOperation.java @@ -22,7 +22,11 @@ import org.bson.BsonType; import org.bson.BsonWriter; -/** See {@code $type}. */ +/** + * See {@code $type}. + * + * @hidden + */ public record AstTypeFilterOperation(Collection types) implements AstFilterOperation { public AstTypeFilterOperation { assertFalse(types.isEmpty()); diff --git a/src/main/java/com/mongodb/hibernate/internal/type/MongoArrayJdbcType.java b/src/main/java/com/mongodb/hibernate/internal/type/MongoArrayJdbcType.java index 1f577645..3d68d056 100644 --- a/src/main/java/com/mongodb/hibernate/internal/type/MongoArrayJdbcType.java +++ b/src/main/java/com/mongodb/hibernate/internal/type/MongoArrayJdbcType.java @@ -32,7 +32,11 @@ import org.hibernate.type.spi.TypeConfiguration; import org.jspecify.annotations.Nullable; -/** Thread-safe. */ +/** + * Thread-safe. + * + * @hidden + */ public final class MongoArrayJdbcType extends ArrayJdbcType { @Serial private static final long serialVersionUID = 1L; @@ -58,6 +62,8 @@ public int getJdbcTypeCode() { return super.getArray(extractor, array, options); } + /** @hidden */ + @SuppressWarnings("MissingSummary") public static final class Constructor implements JdbcTypeConstructor { public static final Constructor INSTANCE = new Constructor(); diff --git a/src/main/java/com/mongodb/hibernate/internal/type/MongoStructJdbcType.java b/src/main/java/com/mongodb/hibernate/internal/type/MongoStructJdbcType.java index 2d383196..d4e5143a 100644 --- a/src/main/java/com/mongodb/hibernate/internal/type/MongoStructJdbcType.java +++ b/src/main/java/com/mongodb/hibernate/internal/type/MongoStructJdbcType.java @@ -55,7 +55,11 @@ import org.hibernate.type.descriptor.jdbc.StructJdbcType; import org.jspecify.annotations.Nullable; -/** Thread-safe. */ +/** + * Thread-safe. + * + * @hidden + */ public final class MongoStructJdbcType implements StructJdbcType { @Serial private static final long serialVersionUID = 1L; diff --git a/src/main/java/com/mongodb/hibernate/internal/type/ObjectIdJavaType.java b/src/main/java/com/mongodb/hibernate/internal/type/ObjectIdJavaType.java index 9b693201..9cb5bf7c 100644 --- a/src/main/java/com/mongodb/hibernate/internal/type/ObjectIdJavaType.java +++ b/src/main/java/com/mongodb/hibernate/internal/type/ObjectIdJavaType.java @@ -29,7 +29,11 @@ import org.hibernate.type.descriptor.jdbc.JdbcTypeIndicators; import org.jspecify.annotations.Nullable; -/** Thread-safe. */ +/** + * Thread-safe. + * + * @hidden + */ public final class ObjectIdJavaType extends AbstractClassJavaType { @Serial private static final long serialVersionUID = 1L; diff --git a/src/main/java/com/mongodb/hibernate/internal/type/ObjectIdJdbcType.java b/src/main/java/com/mongodb/hibernate/internal/type/ObjectIdJdbcType.java index 637fb1f2..688afa2a 100644 --- a/src/main/java/com/mongodb/hibernate/internal/type/ObjectIdJdbcType.java +++ b/src/main/java/com/mongodb/hibernate/internal/type/ObjectIdJdbcType.java @@ -34,7 +34,11 @@ import org.hibernate.type.descriptor.jdbc.JdbcType; import org.jspecify.annotations.Nullable; -/** Thread-safe. */ +/** + * Thread-safe. + * + * @hidden + */ public final class ObjectIdJdbcType implements JdbcType { @Serial private static final long serialVersionUID = 1L; diff --git a/src/main/java/com/mongodb/hibernate/internal/type/ValueConversions.java b/src/main/java/com/mongodb/hibernate/internal/type/ValueConversions.java index 9a22f04b..121dd66b 100644 --- a/src/main/java/com/mongodb/hibernate/internal/type/ValueConversions.java +++ b/src/main/java/com/mongodb/hibernate/internal/type/ValueConversions.java @@ -53,6 +53,8 @@ * Provides conversion methods between {@link BsonValue}s, which our {@link PreparedStatement}/{@link ResultSet} * implementation uses under the hood and rarely exposes, and domain values we usually use when setting parameter values * on our {@link PreparedStatement}, or retrieving column values from a {@link ResultSet}. + * + * @hidden */ public final class ValueConversions { private ValueConversions() {} From 047b90d53119fc161da3984580fa339e534025d6 Mon Sep 17 00:00:00 2001 From: Valentin Kovalenko Date: Wed, 19 Nov 2025 23:59:52 -0700 Subject: [PATCH 3/6] Upgrade Gradle to 9.2.1 HIBERNATE-52 --- gradle/wrapper/gradle-wrapper.jar | Bin 43705 -> 45633 bytes gradle/wrapper/gradle-wrapper.properties | 2 +- gradlew | 7 ++----- gradlew.bat | 3 +-- 4 files changed, 4 insertions(+), 8 deletions(-) diff --git a/gradle/wrapper/gradle-wrapper.jar b/gradle/wrapper/gradle-wrapper.jar index 9bbc975c742b298b441bfb90dbc124400a3751b9..f8e1ee3125fe0768e9a76ee977ac089eb657005e 100644 GIT binary patch delta 37435 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 delta 35540 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%0A!3{ zp%gi03-h8;;^XKp2;(Me<1qd>50J!Lf) zy^IWBgcpzO)p{vCSGOQ4ezuZF!rXS}>{;>BxC;Nq3eP_o#H7k&Wdzxk7zxlWizryR z?#?f*RTfj$Va}*H3EtHbKPsB2O6bbR^PMieQ0O~%{SE6^pAVjkTMTCm>*Y>?GJ>Bq`4Z$WwLUtynJ z$b=f@zxvfc<4miuKFb48dgV2ra!*Wgp^3g98>hCc$TCwqX`M+4@eov7P9}b|3alIe zf)9b2Q^A(<(p~ocMmasiC;JBkA!Waf!LCHt+`RgW?w0x>D^JR_@j$H>Y=ZXk2>9X+ z>@36Tb-%l3!19phJ7^Gnq1`5i$(~?;3VUCC>~2{r`@rZq(sd5HaYP`XwdVGb4V`~IW3I==4uZ06v2J}o^>&)G4rgv zGN#CqIxS`K7u1t&I{3JwG|{}u5|)uZ=-w45%b*ocvH^rU4lK8$$!BSBqRPb1ifwC@ophfdH=X7i>@ zdrLTYv)m%texaXBCmL!HQBlFOQT}cDvRLc0`^!-m1`+yDa$9_2BGN~to7U4wt~NL3 zCDD#wCVe(Ei?#6%S@~OM<&|v<{WSxBp|GRl4m*rc1F|W|^cwwt5_#5o&ma4*N(BE` zB}oZIppwJ9I>zVa+(MO;j5IE#YW!jWEu5SPLP%vGk~%0EZK+I1EP=cZ_if1Od}Vh{ zJ^`ikdZ<6g(+GKeKPO>H*=}wKJ*oMN^+Fe-AQNmd)%V{pb{z8@`*s80AMR?vQm?uC zJ&*}1HLlX_?Cs#T+0*1IOr|o`XU;na;x_&O86LoO6m{Vht`%p@)56FqXez51FGG)< z!+i37alFZw4Zo3T99n8nM=i~H^^KjK-(|1dQKGneStX?QdFUFzp1yt;gAoP|h~1p^ zt%h2U{(!jqgarg|AsSmn*!)AW)`6~Lu?Ni*W9x}eZ^EfH(Cgh;j&BEQv%7UzUHU*E z8H7Y6qwT+v`Vz4rGMTc!1f=m@@*Flj7S|FZ^&|G{?{Eq;Pq1zY&q%V{Ad;}h{Mkjt zbUwBF^Q8k<#66d0yaVm@j4ZC0>+KRW~NIUmc=OZfg?XuTMQeSMvgOlra(r&;1-g^YQm>ym=tcFJm6gthL_zdC@&MwMm-mTtG3F=Pz8pcfM|_&yfC} zf|Oa7$G-&|1%~h}I@`teSG^nky5djv9y%%a=&EoW*>Yb2&P?~n~ zTq;yFpKr@(9gz#=s3)7K-)j%D<#ZjCW*7?@!j2cL+9}xJ>=3JdKU{Nik2NW60Mhp;uZDiZ_QdtpW>o|_trA?1NdaFBd?^B74 z^nm>l9FlS~{~FV2ru1j>T9S}1G@IRysL-l}s-3P-Mi(Pa0w(`PQrgzWA=nUctUf6X z^oxnE7sbt#J2jQpEMg`0pe-xD&dOrA887EdKY8kWbF?!Jwb=q^!^IR#4bd*sHxoE) zyE{1M%!Vj;S$!TstENmbjX^K6zk$ksm9B1^b1aT+JtVt+KZLD)U$1MKlBbMZRj&A( z8uquo7)n!9sW^#e`N(yqx)w%?@|BREQbnAjgg=Eh(gm`&=sxcG_%0jVMPPu zC@|=eAB|WzCQMg-uf>d=Xj@6~kwS=zy9Af>6Ju&nj1x1CwEGKGLh(E!*2nLI;M8anJ=gtc;8`3=T8_=|KaaC=9#|=3ysm!1jfWt z81r2rKAnX8f95|(=>CRxfv5amV)BN2dVKURF+qj;|B1AZ$!lg-}n`8^8FpmIW|dc{wmy!JM_GCKXvc>Ex&Dn?I~sM5(V zpxXZ`j5>+Qd&nCyjE+;?pbcd5?Dt*^zs0u>VyT>o@f6umGzP+LF0;Hd4NTfxCXZMhnzyCc}8V^PTC58~hxdcD+z{8%@Vr52fnVmQVXPSpuYwMyT zYWy%Bv8vn{f=O}h8{6G}u6DmR{j$LJKaGi_9m zx8*bgG;#aIlz@69HJZC#;AiD`q**$a)uSX=$`eEqo~yk1F#gV?nB~RVI)KOun^!+g z(4ju97*~J2a6R9@$Z#*iEINz}TT?x|CR%cmUpEL-AJUPkKT%7DppsaBaSvpCdN6mZ z)oG{24HtjYH|Y6|8t{I%%vWl9t$5^i!!+Lf>P<*L3_Kew6=n;TX&4=MuD@drAYIOv z|65_9$vys*vOXBW3!5OYw_$y}&tHk^gIk+w+k9V3cI#5D8z$|%Y!Zw`U|ZNVuvJ4k zw-JWL1&%X1k_>BZ^5C0vqyoRT8Dfr_LIYS*V~B5q+S^i}XP~8d66(trbKJKk^wlKp z)&^vJ0pkiE4RQO+LnoYWt-`R@>*iq?ejrrY@#_X43~KQ77bUL;Tl3mECi1g)v)Lgj z*_SDGY(LLXCCasH|O z70!c5mQxt~jN)>#P^Y|jhkoo!Y4?Sjx&PLx$UopX+V+sc%EdX_5+~**?YSEKp^C(V zVO_zrI(L|C{7aX7SxS;|f!@~bDn2ic8Uik7vBc|N+PY@rkJz`LQ51bh)tSJ(8E;l3 z45UK6=TE{#o6y?qvzNDu6xL-;A4kBD?`6gwTrrL|%<`^?cQ~Tq{DY!RxqeLk`-GK4 z1*SY_z9>7mdm}2?6Y8NhJ$TB<4^vN*yrrH^lwee5T}#I z+%`NqD>hX0!7p=$ON?dF2*WvJ#9r_+<{mBc7b;DM!S#^v78R^gdp*y6o`IqMJ&OVr z!#z>EwcnThJlWtrSi$Sx+d?`<$^A_-%uzvyq0C{IQBQjW43~f20QQ?*O(hjoHo%e% zi$rBF4F`u7+c$$8d@!vN9!+&ttwmXaA`qE`g)jXWdFmud`mclRW|2dHo3seNWE3A! z+j>q0WMkHo89EGpu1_I%{|rrI_^&?VQj`;!^(O(WKJKQh36#LZHP4hnue zSwhXmGO$lgPHUcSRklRgwPBu2qS47)dSv-=+mTR0QP}5yYsH$?;q4LeqGXcVjZo#gafX<8q1)W$@pT@HekrMA~-s8!!wVC z5>vhi+UHMmq_cWvQH8ztBPi0i)!W#9|lQJRJ%3FO2O?3s+C;WYCpda zOcy5b-Ze zO>91#8s$xV3cKvlI;`XNGg5|U6MCD_*`J7A_uFZo=t3e$^nq+Kj-rwyzk9N0w2-9Q%ENS;-Em~8P2|+2$x`Jlf4t>Y1J|4op`5U!9EI>U#d&-Psw#7 zQf_YpyDRYBKpsj&P4-1iG>~q{#j(yfKV`RMB_8S8$n(OqP0uvb@oU=U(gACQ!9_Fd zkAHSQH`L=g-V#~ub}mAu;1_3byA0Vb0$NW?S>ei;?aJYo%nCkY8l;57# zw_Rlgzm+fD-v^MN=@sS1uXMsUJ^%5S-J*RVXmdC)Flw~_@_|ZCf&T}eKw!UrK@>eh zE8TveSW!?^WK}2$+YJ~=gTw@-z(WnDr6fKz)7{(c(*4TpZVfT=L;M%U1dS&C0DqM6 zwrGsvgD*34&fIhFxp(H<_s?GetYb;w-RWtw_D1hYYe0dmZ|YW0U)8P9k6ceCZWtJT zXcO~_Jd!c-WnadI)hBBZr+%z|Z}y}Y)2bdhhA$(-9p&h5Y^+)9k2zM=e(8Iu=P?oY zrLo440>=%Alp8qA4oSsai}_mhQMG2+G}PZ}5CVl(m@12QU5^BoL*Yl=u;yM2WgZ;R$%&A4yEbIz%dWH$7CfrObX2H)OWYrjl<4=UUPe=QSY={ z^=4=P;6+`a-1x0%B_n4~1hg&7a|1VdDv+tH90|<+9rP@9J)2YxC4tGUacl{fQ7m8z zR|N7YTdVfjn}(}@xN4om3Hdo(6DT^Ayi_6glbi@FRW3SNxk#089XAS?!7LXZ4I{7x zjQ`U9^vo%4;?~IMJa=kkR?kPP;SQrDJP#F^sr<9}0`85JizR5t=Wz-51+vfiv9pT| za{R#rXXm@|Nkaie-XAhr#sr^$`7fAy^%2wM@+Zul;dc2hFK5s{;K6%fEX(jZfy@t3 zO9u$8Q2LbF0RRB90+X?n9Fyo;Ie!a$9A&jXXZA6(lkF>;lrE)ZNn5*VvI#Aawp&t~ zSKG9kv@{K6`=CsAC&|*?ov=IGHmG<7DxlX3UKK5Jy^3IbpdhxJK!hS{K}Av2t0=y` zUd7k-g$hdV|C`xOvdN~@-|esM?0nxj=R5DmH(z@7(Z`8sjWob?_l-C1T7UQYnm#Rd zNKeOW!Zoq}n);fUks3-QH8WwPLn$M!V?CoMbuFu7b5P5MVuO0@P&Sv!)`a`DWLB@Q z85#(sw4qQ!(CBMwS{+++8DKN(iunDxWD*P6K`pczuX=hQk=FH0B0YfB!+Iu*v#`Fd z;gW`Rp}2my=8Xz5liFkCGJi3Bb0VoTEjKa)jRP4ip41zUWVE3nJ=3_wdfj8cb!myT zOirfx*J+2f#-x@WXx!0vogOn~ax*zo*k@W8+!vYL?=b}v8)~m&nm4)HmejIYnN%j< zfNt*07$%5-#dgD{Q4_4SX=L?SE|V~a8>ho;@RFD2s8m67nUEuboeX zWV(RKWg5M^I%lAD0&OW>sL~P&l%jRYRKw)KnLY546vU`1qE6MemzL8Cm6p-#V3mFt zSD|2u)oeJKRx!Et>wk0bF{bKZWV%^5)b90CJ%v=NqXyW@<|JV>3Yv{OHFFR~yqL)W zhTuQJQXz^mO@#+*Yv>Y{R@0?Sl{5EcY6459VSD6+UH~FifW3~^SI}At7xhxuk?C?K zS@;r&cxj_8{uQ8gc_N)KH%=38!YjShLaiz_Q=6^Uomxgun}1&F5CocOvrV*HOX*(P zYOldw?)?qdX_@5;ZHEIi3}p-ihndi`3Uz_6j6RgqL{Me2(8{_p=a%85oDp}>PNDfL znO2?~5lfsN!Q^h+;can*g1mGUtrt6cm;zG*J(f(srBf*_9giSo03oYqWQxM5L7Uz_ zmG;tpSYJyfjejG(=|gGbNP5SRaCmqP!$Yp2gC4+Ki?;!V`d~Mkcqj*2p+O@B|BFLw z#*iH)Ys+Sc$n0F%r$HnAG$6PcJgW>gv`p8*7FuQ?mx2m*4-dhg7DT3{AdpN_%0q_; zZ1MF94IwD6&n0wIp$t~q6@m#Xvcp+ZPlbe`6*|l`*MB0DGZV?iNFs~ucN9YP=w`qM z3=}+KIAHV#%t1Y{?W(RoP;VG$2!z^G!(z8NHGEi0=JeVIg>JwJaXlN$BntYeEawbw zpf?IWZ!E^Kb$UxCqYWbl{{`CBvVs?;6(!m&26Cj7We~iHZdU2dbjwU#T22t3qEVUN z0_9Co*ng^J2O+LZw;`+BR?W5!+pNM-BBhXB+7OO=E4@uP$-mAZgl(Dr4FXsSflDn4 zPUW`ENG9!M4kCBbJ5;)Z{+-DmEDvM*?7LLDo!%{KQDg?!1(5fsbSu4=sp++XVR@_G zZ)EIn?#cBP_GP-8X-n`dPHSUtm<};RxdndiQGe-u^dH5fXxXmQ)H7P2NN)ehq$I?f zX=H>{Qx()%SciH(NcUFI2k1jZDkb|e-H&XB_M%%qYFgoq&>f+VRM3a%qo@;UYq_+Z z6uievAEyTd+$WgoUsGT9qsP=taQ-0tHKh&r>3GkWI|?3NHW`DRPtn6FJw%^ol0qSc zPJc3mUh}w?eh65|M>36y0615jKcdnYJqoRaLi?_1K2WF7XYi8JOcd9wmmU|~)X^!F zhHS1cTX65{U}xEE{aJcaKz|OI*GQL0yZ0PRz-x+X6P%)79Qy@2EmZat)0%%CU#2f2 zn-$mgAT1Wv>!m-_M}%fxva}904kdLHy~AH^^ZpH-Br#i< zgI4~4Azz`t3oHEtG8*Y_qtF+4>3@vS@Iw%S=38`%=IBVry)22I;vsgFwxm|+l-X72 zTqc^T=>=hOXM>kzR#bMgM<^7EzWiLgV@5WZY%kc0s=#xYUUzOdGS5Roh)gTUg#vpg zFYxeut}Hgrr2sNlsa!2`H8(4K-Yhv$#0q18sACKeq%ejC$53v1TUkicvwxQTl3dP9 z8KcD=jM1X1oK|JVh~dT|Ey*Mb$bB8i|7M?TF4^A)sqTqTt z$h96Q7UPCe3Zb56uo49qNac&TebA#15bGtob7VI+&*F2{b0Dq-#<}D&Nwu0>R zGZo$j8-uK#KJ4X)4T#xgLE-!> zxZpvN?wT2sOHCOPg@0?0j-#0UMFYis@OqJER+iPr^z3AxsjD1gR6aKxzdwQMT9S{Z z9o1&Rr7k#&tmS%sHaVwqiZL;*36_)EwtvxvGPs?#@{S60`26{0 zkUP^^6CcoCLB&P2Sq_n^;wSg#+fcP&B3e_-=y-5jB)C~Ss6ZyG0JY1@KQMG zCY9g7H=_lKCq!%6m$RG2xzlcf_!z%MnB`U&sZrtEkq$7qnw@q><>j~8+d^OyT#y155A0 zy7X*T8_?Sm1G*??$L%y_86_?5*H+J-rpnU*KkwsvRKA-r1-W{6Zw{?fSPVWO+d6Ct z?^{@o=Dt=he~|ALN4wm=4;ims97gPJ~ucI zTkPDmV_QetZiUCDL0b1z{HP5%4#*o4LpJtf_S)n2nhp1az4lo|f_^lX%w-dYtxMaM zSPUxc(tpy>BI34rs_!KrU?#04?aQ^K5jzBRHFnI34*h?QKktE4eu3$N*#mC*YMC)@ zWX>8)rJhzUBns5Z?v>4kwiUjp^3(h!+bgUq9Mq4Jk+pEI!_V+nRFe6tFls|Gc1Yo` z!J4TpQN}emo||nr?e5@!Hm>qi_`-BMkXNC9uNiyD2#Dq9=LAl%Nog?soR!)!MarB@2mX0=sT3O zmNrCIwi@hhUj7mPSk&g9xJdk&*Sg6;{LLqdQwP+&3zgJJ*_O0!LK%aFlsTgCFIE19 zsDH+)P}QK8PU|QW7X_zW%f{^0tYxzT2vqlL{*6HWEz^>-g364!LN+tQ5lAW0&1|H_ zKIr~||ETis`ADGoA-K=)?ulzTa|H3bq z%p1E0VK$V`zav#-le#`6qJNtJf0fUu{C^J#vx_qZ5A{kCAssv|If`CURz6w6s;aByxs00)Adw z8gXeYC6r@|g0gSgHMulTnh&><78Ga9!dC|?I3lQ0P^07%*TI3pSBQvLS}49$EPs>4 zC^9XaiWq(*(TQel%8s~>n-PQd7I;}KU7$+mOG~`eVgI^N$g;2WL&+@IR?tfqsZy1M zsbmi7h6pm-cGEAb>{T4NTv{Ovi1DO4D?a+b!H$|G?4BQ-{X8is)e3YBD@$RqhC)l6 z)N<+AAlh=f!x#2aqpB@9Wfn21HMbcG0rDrpl_$7JeEiZ5rnbw_TiHBeM@U|Y+sKz|}#T%KAw z11nc#S2idT<|Q|BEDHKGUd!mG46nsGNotom&^$<+Q49+Gu(-EZq^;s3VVTRRDYq-q zHgo~fcBaMvd=Grb14p!k2_P%`Pt@vwW@WH|X;{S|4Clx#3MJG! zIq+H|5)Q(6wXqGk4oh*&i1o|^ZDiAZ`dLLvfT57Mj z!#N9U`vq$UiY;cLYv>tHo7&OIsw*8Ve(1GmbQ_k>x9k0zja)iz-+#DCTJf^Qf|-IG zLpB$mZc&59^-Xs!)u(563m)hqa*=G6SHv7C_{Wk?hiQ{l-lbftLlpHTkvmNWu&q@PrF8` zH&0jFe+(-?3C>VNpinP;&6Se~9ZPJW=t zP|oN5^1(bkou{vcT_a~6!2Z{){RXi=zd29eY!ZOg0R6TNTJ3UPYyJ9sp1voLjsWTV z7E(YUIVVB=vU?J2=fm`)yJ-=Ce_{cP&fNsSic>rwhmo_?RFKZ(7kA#|Spa-4icL2Wi({h}W) zFNa;OCZ$^OLtU@l`|3%*t6FhhD5t$n;G&x@l? z%009|(DU(B{IC5oWOz4T{?m5AAVxi$U z_4wg{&0$w%4C~Rb+u~uh^CsaF_RFQt57BwT?eONv^I9;2s2L%BoYzNvykV3tKV|>i zD1JW7ZGU@w+%d+TIO{Z3i_n5dF5vjxke@<6-af|Nv+T~ZR$QPWLNgQC80Y7s0)MyuppU;NLXUq?#QWhX?&dJU?59=yvy_j2 zeoR~I;;`(OpQ7Hv>O$AM?xC&Y{EMg+UoX~!gJ0$Oca|glIokacEk&e*#w+-{fSx`! zCh-WV+x>F)2rop6>V|#KJhXj;J%0H#eWxxjIpIFgg5&{)b^I$&VBEJwt@BA0LVqA3 zL~Xq#L{0s;G$-0MD$T9WOO?^C(=@;Sapwm}t#_>H8X*^V)t{!_<5E?0e*_TKd1+CX z^D$Zyb=3EaNlWumU{qQ*CauKDpdQLgtFc=VjW~SLB|SdrQmn7Tij0+2J&d=Fd-77t zr-a_DGYi0W0pXK&uNsy1oSMRMJvfdQIi4oTzT&!t49sgzQ58Cdxr$f1 zmKM`;3QB#>2c0M7XQjAv%z4^+KI8nZc)F|Hi`_?w+^gKHt>;>I*m`bsZ-2I)o86u6 zK|CYw9oBQV`x@)n=N`14Z+0J(Tk$;RzSDw#r~5APlw0L4>$y|zv7Wv1fc3mizDYdM z$MoaB2HI}*HtR{Eo#ddsA+l@@R%RZ5>ApY$kINq?uPT6&TeI+oCRjsPuktRTOmmd8fhAI-!DDy+>i5h&;6fs_k8@|!vGeGl>*x? zyKME6ORBq#;D1Il7OM7F2YagPtAlp5&x#n1WygF`J7m&$+>Dq;!lcPwBjF47n!$~U zWHeFj?=d0?v%b17?28(GK8s~^H#aW|E^eZ=@g>>)J;_Lf1`@r7ZxOL(ENsP0Gj7Gg zG`h)*CrB5KFKIZgVTmtfZmPaig%Hp>>|{J>uCyYiz<&%o9&QZBjZnmF?2j9LeP+C| zHI{IUNMzn31qA|=HyE3Y#)uIMH=fl=ysr$i zH7KYOD4@_&{HD|_Xd8cq0BI7pOdZN+|dQT}UGsG!vAO3n?eV zHAl>#|L4UKHqXn@76uxMT`NAR;S8K9aO_cTQg9Yon_hT^9i;%A%?a6#RbybHV@tv@ zqY742+*wUuOcfQveh)AWWgG&Eq_7>&ZRrvV_1=7+&qioV1y}UO7kVmc?ht! z^9d>P2vo41lCF;jB7_L#`BI4v`BUi9Z~-o)V+;`hJLE-o`WS8WmaI3F}bML(Q7PjYVJrzb!=phHh^xa)?+g$n@+G-V0PYg&3{4+ zdl7@phu245n43vP8l9~nU#$&-H_%!RgG_vf_$ub|zzr0~h#d}_q-c7+JJcp8N!yLMsfYsqb@F-zrw^r7RVWJ; zRVu#8Fw(`avrWKzSV;YZ$bOXCwKHmUxrfNO2X!D^K=M?2re-;3}!yf?Ns zO1TRDNd`G~o83>D{4@6fu>m37M92&FB*6bhEklPZwTM$(yE+DP$xx zYB&x%KT{L4WPd+BKQTY13i|T&$XS7M`eUMAnLo4eU2`C1OPPJK=3mP014BnGB=ySq{BC; zimpV|O7Lqj!GJ)QO)O-!B-ks3ieTCaeCrNi-S383FfwtN~OiN+G2uEKunASds8U6y=<}Vz?tbpHBpF(fvAfkT7-K=_=i+obLTCQ$|R`2r`q;Qe9 zFa>8DiidHrUmZXz^Optu>XW4Fz&l=b1eXW=+7LebaC5P{SufYii|@c}uUf7z4)`ZX zqkoINnwP%5(0PR}1`fRH)%>bgeE?q;NPk=}uocJg*VhCdp^*4Bvi}<#5UxMKz>2&)u&X|h^+@R|eUUsG#w#i8EB*aJx3cqUSLy50<2MgZ z3BOX%tdb8$NvnfEo8B*9iIf)=No(}j6_<&3QJdD5GkAI}_VSnjI zDGs)0053?F3w>q6MSh9)5m6BE?8N(lfVZ$K;4TxMj)F3wb`&;yQlhxr)73E~CZMVyTCf{6UQd~r<5vrILJ9bb z++L-FqFs~{^XV*KX&=C3`c<-^V}IzQ!Z$4HQ=*ZAK%DAh>f4Pu-hynD3cJe0qH&2) zUt5yYJo+(H!8*FeFac#oy_pEfXioz5B|KDAia^(g{?)n15D^Ig(b3 z6D2)atd=w?`oyc^6mgNbO46&vwUS;hwo7`m7?$)Qu~*W);(4(j5HE_CB)?z0#ng3; z>qhqkv0Tz3(c;?fx>fQ_nZM0-r{tM3Kj0daJX7X}Tn|c~Df2sBk4T;=^N+cnkUUf7 zpK`q-d8W+obG;#Xrp&+XdVg2)OqqYr^?~G>GXJ5wQ1VQPcbB*;n3t4z0?gA1JU5_{ zfLGv50^m-#u?_|FtXLP5-f;+%-me>fWs%!T12GVW|5&xPuGV_G@op77bzQ0`Ma3II6cj;0@G{*_ zx6$l@WLq!9K8SDOg$Q2w06vsBTNM!*$jtot=1)l8KVIJeY+_#EvERRF+`CN~+)~_f zcio`v*4!Y8Ql(|4lGuxq7O`$fleEN}9cjIwL&2@>M%LYJOKqut=BA++$<$N1M{{SV z9&BziYZ^cE?XK1=*pBq-+)^B>n8>I&WVJ`e@>#4mHnuhzUW>Zd%6?zt$4SI~ zlcxhlC4TO|$3k0wD%~}7M%K!ZiRsf{m&+`_EmNcWDpuKnz~ahZga7dAl|W%-^~!;R z$uf$lI4EIk3?ryIC}TXYW(0;0`IS)TrpP}tglbN4Rm~aBg2TZCuXEfjpuhoC)~>H# zFtz@S>Dn`9pMU{c7+4fO0Z>Z^2t=Mc0&4*P0OtV!08mSlwUii>vw$yu33waFb$&wt z1h|3@lA>hju-BAmfjCGV5h+8q93HYw5uy}QM_|d8m%xHt3D{+J7m{e#O4`V2j<#tM zr-_uta^2Q+TPKZL38bS$>J__n)1+zBq-Wa3ZrY|-n%;+_{BHn|APLH8qfZ}ZXXee! zoA>_rzc+m4JDRw#Hi1R(`_BX|7?J@w}DM zF>dQQU2}9yj%!XlJ+7xuIfcB_n#gK7M~}5mjK%ZXMBLy#M!UMUrMK^dti7wUK3mA; zFyM@9@onhp=9ppXx^0+a7(K1q4$i{(u8tiYyW$!Bbn6oV5`vU}5vyRQ_4|#SE@+)) zk9CgOS|+D=p0Txw3El1-FdbLR<^1FowCbdGTInq0Mc>(;G; z#%f-$?9kmw=}g1wDm#OQM0@K7K=BR+dhUV`*uu!cl&ah;|OXFw^!{Y2X_bQ zcDjSDpb83BAM2-9I7B~dIIbfN_E3;EQ=3AY=q^DmQncV2xz0W-mjm8_VaHElK@EC- z!ktWFouH=5iBgisaA1U@3bj)VqB)H4VK|{N+2-(JHfiJCYX>+!y8B2Fm({k0cWxASSs+u_ov64=P?sTYo z&rYDDXH?fxvxb>b^|M;q%}uJ?X5}V30@O1vluQ19_ER5Rk+tl+2Akd;UJQt1HEy_A zDoA_jeuet!0YO{7M+Et4K+vY}8zNGM)1X58C@IM67?0@^Gy_2zq62KcgNW)S%~!UX z1LIg~{{L&cVH^pxv&RS87h5Dqhv+b?!UT{rMg#O##tHOouVIW{%W|QnHnAUyjkuZ( zR@l6M%}>V^I?kADpKlXW%QH2&OfWTY{0N_PLeRc9Mi3vb*?iSmEU7hC;l7%nHAo*u zcCtc$edXLFXlD(Sys;Aj`;iBG;@fw21qcpYFGU6DtN zH*Xmdk{4fK0AKi6FGJC#f0@j_)KD&L`tcGuKP_k_ zu+uZ@Sh<3$bA}GmGrYql`YBOYe}rLwZKP!xrdrur0ib3zAR%*So7rZjP$|`v$!nA9 zxOQ4sM|Is)T`iB$29KOE-0_Y!v(GZKhMia4am~e#u5PJbJTk5!5Jn35E$W1AVWB&z zA{r<8tP)wo%Vg0}o(EZ}Ts5eMgW$E9nUDxFyhPP(s8$YB7)%~lUan?sD~~9DckP11 zEa%9&uY)hvUwxUwb}pf|IT$VPqb9AAiAuw>G+8N86Ovlm%$~Fhhg1!#<%uJPW4P+L z>rOa{&N2gbFd3Fh-nnA8lL@IrHd6K33HFYag|7^pP;EZ&_CU5|tx*P)T5w<-hNeoB7VAth{E$^ zzh&!tb9x@TA^<6 zWYl=|`BSI?aM#~0G0T^KK!+74^cJ#Nj`srvw<<6EzM$Kx-86sp4;1hc2-blI9c0tmCMY}Qn=5b(4Vqv{|sKKb)cXA9B?~> z#9fzsZ29S1Tr62*LHahw(?8R{AQudS8<=zg^lz2qD}8im+_uhWqYUr=fMT#sIo${8 zzZfe2N&j7)tPfNL^8Z2}6)v8;x|<$fDzHr5?L0g@AOmYTwm%3~HQmw+c~!W5LEVM> z2|z;BF)jd7U&jQ0%D8~=0et;cR2&d~)H=6#Rr*B(V9$6xY#V}Z4=>PWem5wViJ&4B zv3xeU=0-BSSJgLq4Ssb;S7t=xC1%@8T#c5w$= z0*}ik;4@vwq3Am7=yuN-b_|MEpaRpI;Cvp9%i(}%s}RtlP5ojEwsLfL7&QhevV-Ns zj0eq<1@D5yAlgMl5n&O9X|Vqp%RY4oNyRFF7sWtO#6?E~bm~N|z&YikXC=I0E*8Z$ zv7PtWfjy*uGFqlA5fnR1Q=q1`;U!~U>|&X_;mk34hKqYAO9h_TjRFso_sn|qdUDA33j5IN=@U7M#9u zTvV5J{l0zdjRWGKB8J3Uz+|(f(HYHAjk#NQ1jL9!uha9;i4YYO5J$mewtTo9vVtPT zxqXvBInY?m4YD)~h~q$Ax!_EwZpqbZI3OP3;=4xaULDboazx{;=E*zl0g)CIxiwU0 zS+taYYlIHHMHZAe8xkWHvSjw;0&`NOTN%Xcr-ivm9Bz1h6ny%66)ZjF=M6S}>=v4~EuG0F; z50<8 zuJ7@5d0V_2pQVkF7Vq{{!dIm33#3Ft_}G2)yjM)!d^I{4d6C{M=mM$U&yqhi=!uOq z^+sms!NF^^FO?LLY1%(UAAuAQ;Js8WHnK=;BI0?Gj@F^p*@W>;sZ=u3l$xf8pzH;I z3P)vOmA?n#aMPBi8^%0|sj#w@`5rIzhQ!tSbr|=tr zz3XA)gH(s7qlZqzSnr3GpT_7Etp6(f@@<&&Cgd6@O_{P$>oL!s`$Ftx@?LJr&QNaX z8kwntH#$vkYg|R22_$?WFI((Ps;mBgX=;jxe4dv2B0W9@Ytx5X>gz7C*}oPKd5d(e zNI!)2=dpg8p7eD2T72>A&r(Oc#kZr8Zl0T=_oWh8{A0N9vXFPx)*^lID7MGYhmW53 z!69FY@je$)Lq+<@3s5PVD$*r5``M(QjgmT^@OmO6-sp%gHc}rSY5JLvw`8Gz=TflG z&)tw(+<*mIXdUgu%{CxCbK8#JowN2@0SO=M^#R!H6?`{v`CUe5FJ?SwyCTwGaWuck zZrbd*cS97n*}$HSL^o`QV`u2{Me=!GI9~_dUxVbO7s|jzu~fEkS2;SKy+&74sr^v1 zSfo!g?rt#d&g0|P1t9ae)DZ7~4AaMp^qVvE1qqxlUZ9nHsoy&~b@Pi;bSxIXMqg&h zucX*B)AZGlZ<_wNNMB2M8@&ts^)Xsm@z<+UH@_KAm7Vk&{!iU}$6y2}y>=s3q`$h% zKQ|De3gWd_T4=Rw*ODsRR%(-Nn7U+pH|>$_UfL(yBps0LFddieaXJBi>k?^{mF+lL zvMtd2WXr!S_d)uoY)gJo;16IEvvuH(Z&YlEF~4MtgVERw{mtdnP$YGQLX5QNiKcH( z)87Fhz);ga;3ro8{wMqZN=5qDvS|E7)4xm6|Cyb+fwKtysRw&ATYU!+B2TOXK$*G3 zl~^PtLwPV-6rR$Fz;;o8z>*(s7WJjAq^m9+Eguv+(JTTuX-2FlipGi#>xbCfU@qZd zcZ!5pBz#h2ErNo*n((t*0g$hCrXHnm|i`@X6!d0j(RK8a`Hw z2l5S1eVl@8los!kPhF(7@ijcCcL%PBB!<=~MKK)m$2=`T0Eu_#R=NXIH=h{{`4iqL za>{Mu8oi!s7Kf(A;TzGAKje#F5l5QETXFpg?7)M8D4Qw*a~?Z-8SK4tke9LDVAp2x zFf0l}5RJ{^1U}<`@`|I)B2%(-WLk{fsNVS{3NYNyg}nR)ue=tyK_MEWlVVgDvV8=; z&C^-g=a&0t>2a|ceQr0P|8{y#_POQ$^YjVX=a&1Qq|36;E%!Nkxz8>4U!u>;KDXTe zI(~qWgw0KJDS&EAzCZPW9FjGEvA{wpmQp~lptydug=H;9(okb!NK8l? zHP&F{-*kJ}F6>9y4~#K#AzXzT#l#<8fEQ&vLyM5mhMnx}&YAZ)?@Z3jpTEC;16YG8 zaC~(1rus>5N^76|mcF4|yZVZ51zyK-W$XmL;RP+?ct|eEh==&9(Oh4zSZhyM8&=Qw-Nbb{5VfUI;UW39;}eCBZ*%mJ!ic>%UR`~> zS~Xg9sDB=X5J)$IB(&&-h`VEK=D09=41jZa}_^O(<+( z@dU-oVCobs4fZRXVC6E#mw-{_oB9V(O9u$-3H${-0ssIWldzOjf5Si!#%E3c#9Bq4 zK-p6(O+zb|P(={Ilb|T{zS&HZZ8w{+o7RKa2k|XD2_Ad^A4;5v9-M{w_q=X}6rk(Ww~N);x^iv)>V)F>R%WhPu8Gn7lW${nB1 zg?2dLWg6t73{<@%f1XT6a(qfz8~x4CS6UNrnFvN?(WJ^CT4hqAYqXBuA|4G-hEb5< znm_x%7<3+rm6dp{G%`3UY#OFkBpSmQoM5x6G zZPijL*Z>uQZW67A|R9w^IzUkPhic=6I zm%(-`|RxlHTyT__;TIpHtPB288^%``Bpy}I=`(B1HzbS#S^Q*EAx z4u+7Zxc(*~GMtIG28o~(XLX!G7eiM=)yPxBISPB#v`zndJ?z~G&ZAdH4=ynDG-o(t zf4fzG(U*c(G`yvvwG>!)eOpH#E;0lxhZh*mH;kJ6>$aB=Q(^iUP8ycui3r|Rf%`B( z*o|DLxmTuAG{kibs-%KzVslaWt>u!4${j*dfuna=Gjl z-rPoCZgwb{OKc%p!#g#+w~fKv?Jbb;@C$svFq?dVj~E_foIb8G#ZpC_6H8jHE-TcOH8ok& z$_(dqrZ8$S41ZRskt|hN>C9-<3~{+a6@$%*btze+^`y*m6tmfMDYJxHJ?HS1hN9qv zQKiW=4w)*+Dr35=N;rGYbOYDI`P}@%d@fmL=i)~n5CZ;!*3e7rxvVe(QB9Xpl1|GC zOI_%+UT1phon<#QwIWLmy|rgAcnAbf={Zd)RFzVD#eY*)GQH4GKq$+GsmsL%*AWQp zwp1!JQ~UXy6{OnZ8+c#>;oX0k3MSuir|u0ks{}^drwUb?S;`g~H3HuEa^1?rJxd$F z6)!aX?5$j5TEiqjb_k4}Q$;RQlWnyn+Se6~9ueqYl~vhXBhVX*9|$l4qkizhP29?h z{QB1J_J7HKVLN~Fa_`l)55@)X!;Jyxg9!qIPO13*3?JMUK(K;$1qfK)JpqO+PZS^s zA@1E5APmFYdq7~wVCL49(uHDIYsWX`g8{Bj5Ez!O>a7Bd#Nuwn95&p5ney!kDT`Tjequm6|t7FBi0~PR z6Wig3nn38_y7nWD7huBpkHix@;%Pja_}Um_SjHe0FufTsH zh<`!cP7sD3`~&nSW}7hU#OEMs$3tlO0)2^Z5cy(<=ON{WM;!d2D?aJqX?J|m!85M- zqJuBFYuyW`Uiz6>ia_{?WJyb4dc@CbIt!Pnra3m$dw zXRz*u+l|G0iQgXR{R2=-2MAKixJd5;00RI}29vRr9FsMkH-Gzg6GasMhCUKPcr-0< z&=`fbY0~hJS_-JNfL8jVDPW3#+hme1-R#EQO zr8BZ3nX;ya(|=lm)4a|VE*YE_hb1E%ALj89Bbzn?ZAnQncqoubh0{_dEDIY$EiLQg z8#a-y-kQfJvx-6!#;_D#PeZPzWR-JWR#P-P%5{T$(R^$3#^%;=f{zAHxWO1aQ7x;- z`7T-E3;|6~MN+zyPdxV3$Vxo7itK3kKSCU^`H(lUU)HoE~>D^3peJ9 zuVr3%Fn>>ctzhsL$Kk>%3X+e@hH2QY2fert_j|A!e&RsUq(mV+F9KNTAuA6u%-6Y; z*g-H|+p8-Kbq$SO1^T0=sPGmq)?lpw)Ds}Z%|1!zs_F2%C=bXp;zc8Z!f_KrYf;WN zN3vy|dpuNG0LQOs)}xS$X>lXZJO(XFg%Lw}jj7!kuOW-bVAN;}iCM3;4a0JyP`}o{*?zz8TXrym$&hgQj z12KArYd6i?<3&1Ovo%~DGAvs;OlR5g+l0bxPkdYrEVN?ZTk01}-;e1@er|}f|r@K$2{%}g8Tje|b zX@-EZnaZfTe{w9_pRL@lnb0BdP3|KZC6I2xM*}-L@okCg>+|siC&#)tUK8JylN{pH zDt4t7$(`}O@W*eezOr|UPZfB-xzHgPxx;@~pr@Rl0<053d}L7P^Ux-lBPM5a0wZ;u zyHYF%hN%t7nsAPpTW^4yYmzxjkz(`o@oIu_!z+2JaD$t+l#O{xRPj3b0%sa|$oe7N z|2j)zd)Jk6rh2cN$=6>JI6F+qLFCIP2f1sqltoi2fx3=*dzthQT&};TZQffaZvIcM zBvDRuVcN8x6#22F19^~JzM15_EzmvxB4uAYo7R+>b+i!w!E4}B$kB|Bn0BW7U9;pJ zzm;cCmYp73&uc$79`Vu6a0YoLUsUB6c+aAq{p+PxONS#uhv$Ay6b{uT_+110eAryY zo{!hBr+ZjM%T$@-=Q*izvg1Q1&Fw|4WBpaJhj0gb+D%Fni(*duGud~?Xl7m@JyKuP z!bnleKIoLuRcpO1DXOF_uU^L|I`bwWy_aO%ltvtOCpD$2UC+#Xm6cn1by9{*_vvlR z`{3%c_1qKUmO6VTo%3im-=9_IzW3wtI1QipTl|LI)0xiBdG9;+A0D)6$sD4;R#jH} z8JJRMgRX=(oJcy}@H@dZeEo}f7mqAtb=srZjOL)&XB2MmeXp(O)2?cB=T=Plc#1C7 zYwJ{U)s-JAJ6V+IjS}UMDKw>jUo=x^Q&w*GjvudQ)0^(R%}?XZQj#ZQouoylcilA@ zQnM&=8PxbII9Mi0UWnJV=1)rHHYOFg(@KqxIlbB6Pxet)7+y0zmVWJ7f=7Z1d#c}q zcXfv4M8#zrD`a^(&euYtEh}k#FGeWM#oy|EdFJ~G!t($@fef)Rp~!;&ucW(o^kbrN za*}YcQ(b5WqHl8S$h9d7aS{BUCt*d+c|HECGQFNniZ1nny50ys3*MYvsv*(d=*6@( zrFBK!4RYfFrs7>*HX*~)krCaU$n@`QnR4+Qh+DNOAh%Y?eM2*Mh%-svH02$FyZqAU z;yqkQN6_^X@~?+}T`k3mk=ClA9qP>MVBgNWJm%-9Ku_RU=}WKCQPTeTQOhaMsBiSP zB}9=4q?$u7Rc;-Qay+QUe1O|3c-?eMaLXLN7-C?CLU9nvh+(+Q_&L$ehjZ74@{r%Wq;&fY;hqF~zb#3xfeTHN#kN;qL@Jzpeo?KBQ zh>aXE ztCt71#V~MOy%Fr;E2xI=ucSmE1L11K5KkWBYml2hGfcU{ zI#lR;f)r?7r;3QJQ58p=Ly#4Q9Z*_i4Hqhfm*>D*W5A=zV$p)jTVQe6CsI3Bv3;W$ zRM*r-RhM!SAqcDbgO(Wn6UkjiHUYm7%?BDw2)I7oWo43JzQh0)2eBc2f^G9tJq&DP zpoG?phJGRIIJ%LJGR3rqVJQB?4Wh~d`~{lW1SCq8aBL&Au*cXKRauHT`FvL}HZQ73 zB56+Q@KR{O=OA+n7%#Q`0`=MlUzI80a66D6G(l*Y4lK48|KFaxY6;59sH$RfYveg3 zrV&~;NVzK5Ty6_5*(5^{2?J@`0$#ZnyyVaeK_(c$iwv5plt7pRx&u_jE~LojV5_45 zi3$Svwo)1#*lmLL%yP>{bBySOBPzN8f2c5p7hHrsnFt{XSQv1p>ms-bUh=cBYBIUu_QRVaFzKF D0|+Ag diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index 2a84e188..23449a2b 100644 --- a/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -1,6 +1,6 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-9.0.0-bin.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-9.2.1-bin.zip networkTimeout=10000 validateDistributionUrl=true zipStoreBase=GRADLE_USER_HOME diff --git a/gradlew b/gradlew index faf93008..adff685a 100755 --- a/gradlew +++ b/gradlew @@ -1,7 +1,7 @@ #!/bin/sh # -# Copyright © 2015-2021 the original authors. +# Copyright © 2015 the original authors. # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. @@ -114,7 +114,6 @@ case "$( uname )" in #( NONSTOP* ) nonstop=true ;; esac -CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar # Determine the Java command to use to start the JVM. @@ -172,7 +171,6 @@ fi # For Cygwin or MSYS, switch paths to Windows format before running java if "$cygwin" || "$msys" ; then APP_HOME=$( cygpath --path --mixed "$APP_HOME" ) - CLASSPATH=$( cygpath --path --mixed "$CLASSPATH" ) JAVACMD=$( cygpath --unix "$JAVACMD" ) @@ -212,8 +210,7 @@ DEFAULT_JVM_OPTS='"-Xmx64m" "-Xms64m"' set -- \ "-Dorg.gradle.appname=$APP_BASE_NAME" \ - -classpath "$CLASSPATH" \ - org.gradle.wrapper.GradleWrapperMain \ + -jar "$APP_HOME/gradle/wrapper/gradle-wrapper.jar" \ "$@" # Stop when "xargs" is not available. diff --git a/gradlew.bat b/gradlew.bat index 9d21a218..c4bdd3ab 100644 --- a/gradlew.bat +++ b/gradlew.bat @@ -70,11 +70,10 @@ goto fail :execute @rem Setup the command line -set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar @rem Execute Gradle -"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %* +"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -jar "%APP_HOME%\gradle\wrapper\gradle-wrapper.jar" %* :end @rem End local scope for the variables with windows NT shell From f88ef684ed508212def783f1eff1fad6627423af Mon Sep 17 00:00:00 2001 From: Valentin Kovalenko Date: Thu, 20 Nov 2025 00:38:07 -0700 Subject: [PATCH 4/6] Remove unused variable from `java-config.sh` HIBERNATE-52 --- .evergreen/java-config.sh | 1 - 1 file changed, 1 deletion(-) diff --git a/.evergreen/java-config.sh b/.evergreen/java-config.sh index d8f0cb13..c74ff08e 100755 --- a/.evergreen/java-config.sh +++ b/.evergreen/java-config.sh @@ -3,7 +3,6 @@ # Java configurations for evergreen export JDK17="/opt/java/jdk17" -export JDK21="/opt/java/jdk21" if [ -d "$JDK17" ]; then export JAVA_HOME=$JDK17 From 635160be67e850eefeb456e52095e1e89a0a9ec8 Mon Sep 17 00:00:00 2001 From: Valentin Kovalenko Date: Mon, 24 Nov 2025 03:21:00 -0700 Subject: [PATCH 5/6] Add missing module directives Also make some other small improvements HIBERNATE-52 --- README.md | 4 +- build.gradle.kts | 11 ++++-- gradle/libs.versions.toml | 4 +- ...g.hibernate.service.spi.ServiceContributor | 2 +- .../resources/hibernate.properties | 2 +- .../resources/logback-test.xml | 36 +++++++++++++----- .../spi/MongoConfigurationContributor.java | 3 +- src/main/java/module-info.java | 37 ++++++++++++++++++- ...nate.boot.spi.AdditionalMappingContributor | 2 +- src/test/resources/logback-test.xml | 36 +++++++++++++----- 10 files changed, 105 insertions(+), 32 deletions(-) diff --git a/README.md b/README.md index d5c86378..f5bf1516 100644 --- a/README.md +++ b/README.md @@ -35,7 +35,7 @@ instead of SQL. This product works by: - [Manual](https://www.mongodb.com/docs/languages/java/mongodb-hibernate/current) - [API](https://javadoc.io/doc/org.mongodb/mongodb-hibernate/latest/index.html) -[Standalone deployments](https://www.mongodb.com/docs/manual/reference/glossary/#std-term-standalone) are not supported, +MongoDB [standalone deployments](https://www.mongodb.com/docs/manual/reference/glossary/#std-term-standalone) are not supported, because they [do not support transactions](https://www.mongodb.com/docs/manual/core/transactions-production-consideration/). If you use one, you may [convert it to a replica set](https://www.mongodb.com/docs/manual/tutorial/convert-standalone-to-replica-set/). @@ -102,7 +102,7 @@ This project uses separate directories for unit and integration tests: - [`./src/test`](src/test) - [`./src/integrationTest`](src/integrationTest) -Integration tests require a MongoDB deployment with test commands enabled, which may be achieved with the +Integration tests require a MongoDB deployment with test commands enabled, which may be achieved with the [`--setParameter enableTestCommands=1`](https://www.mongodb.com/docs/manual/reference/parameters/) command-line arguments. diff --git a/build.gradle.kts b/build.gradle.kts index 674fbfba..768edbad 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -219,6 +219,9 @@ publishing { repositories { // publish to local build dir for testing // `./gradlew publishMavenPublicationToLocalBuildRepository` + // + // publish to the local Maven cache + // `./gradlew publishToMavenLocal` maven { url = uri(localBuildRepo.get()) name = "LocalBuild" @@ -236,8 +239,8 @@ publishing { url = "https://www.mongodb.com/" licenses { license { - name = "The Apache License, Version 2.0" - url = "http://www.apache.org/licenses/LICENSE-2.0.txt" + name = "Apache License, Version 2.0" + url = "https://www.apache.org/licenses/LICENSE-2.0" } } developers { @@ -248,8 +251,8 @@ publishing { } scm { url.set("https://github.com/mongodb/mongo-hibernate") - connection.set("scm:https://github.com/mongodb/mongo-hibernate.git") - developerConnection.set("scm:https://github.com/mongodb/mongo-hibernate.git") + connection.set("scm:git:https://github.com/mongodb/mongo-hibernate.git") + developerConnection.set("scm:git:https://github.com/mongodb/mongo-hibernate.git") } } } diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index 38309aa5..9b2086a3 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -21,8 +21,8 @@ jspecify = "1.0.0" hibernate-orm = "6.6.34.Final" # Remember to update javadoc links mongo-java-driver-sync = "5.6.1" # Remember to update javadoc links findbugs-jsr = "3.0.2" -slf4j-api = "2.0.16" -logback-classic = "1.5.16" +slf4j-api = "2.0.17" +logback-classic = "1.5.21" mockito = "5.16.0" checker-qual = "3.49.1" diff --git a/src/integrationTest/resources/META-INF/services/org.hibernate.service.spi.ServiceContributor b/src/integrationTest/resources/META-INF/services/org.hibernate.service.spi.ServiceContributor index 8dfbbf99..bb5fb375 100644 --- a/src/integrationTest/resources/META-INF/services/org.hibernate.service.spi.ServiceContributor +++ b/src/integrationTest/resources/META-INF/services/org.hibernate.service.spi.ServiceContributor @@ -1 +1 @@ -com.mongodb.hibernate.TestServiceContributor \ No newline at end of file +com.mongodb.hibernate.TestServiceContributor diff --git a/src/integrationTest/resources/hibernate.properties b/src/integrationTest/resources/hibernate.properties index b59c4af4..63238a19 100644 --- a/src/integrationTest/resources/hibernate.properties +++ b/src/integrationTest/resources/hibernate.properties @@ -1,4 +1,4 @@ hibernate.dialect=com.mongodb.hibernate.dialect.MongoDialect hibernate.connection.provider_class=com.mongodb.hibernate.jdbc.MongoConnectionProvider jakarta.persistence.jdbc.url=mongodb://localhost/mongo-hibernate-test?directConnection=false -hibernate.query.plan_cache_enabled=false #make tests more isolated from each other \ No newline at end of file +hibernate.query.plan_cache_enabled=false #make tests more isolated from each other diff --git a/src/integrationTest/resources/logback-test.xml b/src/integrationTest/resources/logback-test.xml index 428be00c..9af82987 100644 --- a/src/integrationTest/resources/logback-test.xml +++ b/src/integrationTest/resources/logback-test.xml @@ -1,11 +1,32 @@ + + + + - - - - %d{HH:mm:ss} [%thread] %-5level %logger{36} - %msg%n - + + + + + %date{STRICT} [%thread] %level %logger{36} - %message%n + + + @@ -14,7 +35,4 @@ - - - - \ No newline at end of file + diff --git a/src/main/java/com/mongodb/hibernate/service/spi/MongoConfigurationContributor.java b/src/main/java/com/mongodb/hibernate/service/spi/MongoConfigurationContributor.java index 3d06a320..073ce0f4 100644 --- a/src/main/java/com/mongodb/hibernate/service/spi/MongoConfigurationContributor.java +++ b/src/main/java/com/mongodb/hibernate/service/spi/MongoConfigurationContributor.java @@ -28,7 +28,8 @@ * A {@link Service} an application may use for programmatically configuring the MongoDB Extension for Hibernate ORM. * *

This {@link Service} may be contributed either via a {@link ServiceContributor}, which allows access to - * {@link StandardServiceRegistryBuilder}, or via a {@link StandardServiceRegistryBuilder} directly, as shown below: + * {@link StandardServiceRegistryBuilder}, or via a {@link StandardServiceRegistryBuilder} directly, as shown below (if + * both approaches are used, the latter takes precedence): * *

{@code
  * MongoConfigurationContributor mongoConfigContributor = configurator -> {
diff --git a/src/main/java/module-info.java b/src/main/java/module-info.java
index 8282b5b7..a75ef6eb 100644
--- a/src/main/java/module-info.java
+++ b/src/main/java/module-info.java
@@ -1,3 +1,24 @@
+/*
+ * Copyright 2025-present MongoDB, Inc.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+import com.mongodb.hibernate.internal.extension.MongoAdditionalMappingContributor;
+import com.mongodb.hibernate.internal.extension.service.StandardServiceRegistryScopedState;
+import org.hibernate.boot.spi.AdditionalMappingContributor;
+import org.hibernate.service.spi.ServiceContributor;
+
 /** The MongoDB Extension for Hibernate ORM module. */
 module com.mongodb.hibernate {
     requires java.naming;
@@ -9,7 +30,19 @@
     requires org.mongodb.driver.sync.client;
     requires org.jspecify;
 
-    exports com.mongodb.hibernate.annotations;
-    exports com.mongodb.hibernate.cfg;
+    provides ServiceContributor with
+            StandardServiceRegistryScopedState.ServiceContributor;
+    provides AdditionalMappingContributor with
+            MongoAdditionalMappingContributor;
+
+    opens com.mongodb.hibernate.dialect to
+            org.hibernate.orm.core;
+    opens com.mongodb.hibernate.jdbc to
+            org.hibernate.orm.core;
+    opens com.mongodb.hibernate.internal.id.objectid to
+            org.hibernate.orm.core;
+
     exports com.mongodb.hibernate.service.spi;
+    exports com.mongodb.hibernate.cfg;
+    exports com.mongodb.hibernate.annotations;
 }
diff --git a/src/main/resources/META-INF/services/org.hibernate.boot.spi.AdditionalMappingContributor b/src/main/resources/META-INF/services/org.hibernate.boot.spi.AdditionalMappingContributor
index 842d5ddb..a6b49d35 100644
--- a/src/main/resources/META-INF/services/org.hibernate.boot.spi.AdditionalMappingContributor
+++ b/src/main/resources/META-INF/services/org.hibernate.boot.spi.AdditionalMappingContributor
@@ -1 +1 @@
-com.mongodb.hibernate.internal.extension.MongoAdditionalMappingContributor
\ No newline at end of file
+com.mongodb.hibernate.internal.extension.MongoAdditionalMappingContributor
diff --git a/src/test/resources/logback-test.xml b/src/test/resources/logback-test.xml
index 9719b07c..a6ad8b56 100644
--- a/src/test/resources/logback-test.xml
+++ b/src/test/resources/logback-test.xml
@@ -1,15 +1,33 @@
+
+
+
+
 
-    
-        
-            
-                %d{HH:mm:ss} [%thread] %-5level %logger{36} - %msg%n
-            
+    
+    
+    
+        
+            %date{STRICT} [%thread] %level %logger{36} - %message%n
         
     
-    
-    
-    
     
         
     
-
\ No newline at end of file
+    
+    
+    
+

From de745c486995c207d413ed9a69729fa54ab99cea Mon Sep 17 00:00:00 2001
From: Valentin Kovalenko 
Date: Mon, 24 Nov 2025 05:11:02 -0700
Subject: [PATCH 6/6] Add ./example

HIBERNATE-52
---
 .evergreen/run-integration-tests.sh           |   4 +
 .gitattributes                                |   2 +-
 .gitignore                                    |   5 +-
 README.md                                     |  17 +
 build.gradle.kts                              |   3 +
 example/.mvn/jvm.config                       |   0
 example/.mvn/maven.config                     |  13 +
 example/.mvn/wrapper/maven-wrapper.properties |   3 +
 example/mvnw                                  | 295 ++++++++++++++++++
 example/mvnw.cmd                              | 189 +++++++++++
 example/pom.xml                               | 267 ++++++++++++++++
 ...oConfiguratorContributorAddedDirectly.java |  97 ++++++
 ...ContributorAddedViaServiceContributor.java |  91 ++++++
 .../mongodb/hibernate/example/model/Item.java |  76 +++++
 example/src/main/java/module-info.java        |  37 +++
 ...g.hibernate.service.spi.ServiceContributor |   1 +
 example/src/main/resources/logback.xml        |  30 ++
 ...tributorAddedDirectlyIntegrationTests.java |  26 ++
 ...ViaServiceContributorIntegrationTests.java |  26 ++
 ...ongoAdditionalMappingContributorTests.java |  59 ++++
 20 files changed, 1238 insertions(+), 3 deletions(-)
 create mode 100644 example/.mvn/jvm.config
 create mode 100644 example/.mvn/maven.config
 create mode 100644 example/.mvn/wrapper/maven-wrapper.properties
 create mode 100755 example/mvnw
 create mode 100644 example/mvnw.cmd
 create mode 100644 example/pom.xml
 create mode 100644 example/src/main/java/com/mongodb/hibernate/example/AppWithMongoConfiguratorContributorAddedDirectly.java
 create mode 100644 example/src/main/java/com/mongodb/hibernate/example/AppWithMongoConfiguratorContributorAddedViaServiceContributor.java
 create mode 100644 example/src/main/java/com/mongodb/hibernate/example/model/Item.java
 create mode 100644 example/src/main/java/module-info.java
 create mode 100644 example/src/main/resources/META-INF/services/org.hibernate.service.spi.ServiceContributor
 create mode 100644 example/src/main/resources/logback.xml
 create mode 100644 example/src/test/java/com/mongodb/hibernate/example/AppWithMongoConfiguratorContributorAddedDirectlyIntegrationTests.java
 create mode 100644 example/src/test/java/com/mongodb/hibernate/example/AppWithMongoConfiguratorContributorAddedViaServiceContributorIntegrationTests.java
 create mode 100644 example/src/test/java/com/mongodb/hibernate/example/MongoAdditionalMappingContributorTests.java

diff --git a/.evergreen/run-integration-tests.sh b/.evergreen/run-integration-tests.sh
index b7b8dd77..0af12668 100644
--- a/.evergreen/run-integration-tests.sh
+++ b/.evergreen/run-integration-tests.sh
@@ -16,3 +16,7 @@ echo "MongoDB version: ${MONGODB_VERSION}; topology: ${TOPOLOGY}"
 ./gradlew -version
 
 ./gradlew -PjavaVersion=${JAVA_VERSION} --stacktrace --info --continue clean integrationTest
+
+echo "mongo-hibernate: running examples ..."
+./gradlew -PjavaVersion=${JAVA_VERSION} publishToMavenLocal \
+  && ./example/mvnw clean verify -f ./example/pom.xml -DjavaVersion="${JAVA_VERSION}" -DprojectVersion="$(./gradlew -q printProjectVersion)"
diff --git a/.gitattributes b/.gitattributes
index f91f6460..bf831849 100644
--- a/.gitattributes
+++ b/.gitattributes
@@ -6,7 +6,7 @@
 
 # These are Windows script files and should use crlf
 *.bat           text eol=crlf
+*.cmd           text eol=crlf
 
 # Binary files should be left untouched
 *.jar           binary
-
diff --git a/.gitignore b/.gitignore
index ddb3849f..ede46c27 100644
--- a/.gitignore
+++ b/.gitignore
@@ -24,7 +24,7 @@
 /bin/
 
 # Intellij IDEA
-/.idea/
+.idea/
 /*.ipr
 /*.iws
 /*.iml
@@ -34,4 +34,5 @@
 # Gradle
 .gradle/
 .kotlin/
-build/
\ No newline at end of file
+build/
+target/
diff --git a/README.md b/README.md
index f5bf1516..9ba30caa 100644
--- a/README.md
+++ b/README.md
@@ -54,6 +54,23 @@ Use ["Extension for Hibernate ORM" at jira.mongodb.org](https://jira.mongodb.org
 
 Use ["Drivers & Frameworks"/"Frameworks (e.g. Django, Hibernate, EFCore)" at feedback.mongodb.com" at feedback.mongodb.com](https://feedback.mongodb.com/?category=7548141831345841376).
 
+### Examples
+
+[Maven](https://maven.apache.org/) is used as a build tool.
+
+The example applications are located in [`./example`](example).
+They require a MongoDB deployment accessible at `localhost:27017`.
+
+#### Build and Run from Source
+
+```console
+source ./.evergreen/java-config.sh \
+  && ./gradlew -PjavaVersion=${JAVA_VERSION} clean publishToMavenLocal \
+  && ./example/mvnw clean verify -f ./example/pom.xml \
+    -DjavaVersion="${JAVA_VERSION}" \
+    -DprojectVersion="$(./gradlew -q printProjectVersion)"
+```
+
 ## Contributor Documentation
 
 [Gradle](https://gradle.org/) is used as a build tool.
diff --git a/build.gradle.kts b/build.gradle.kts
index 768edbad..4e43b320 100644
--- a/build.gradle.kts
+++ b/build.gradle.kts
@@ -354,3 +354,6 @@ tasks.register("publishArchives") {
         dependsOn(tasks.named("publishToSonatype"))
     }
 }
+
+// `./gradlew -q printProjectVersion`
+tasks.register("printProjectVersion") { doLast { logger.quiet(project.version.toString()) } }
diff --git a/example/.mvn/jvm.config b/example/.mvn/jvm.config
new file mode 100644
index 00000000..e69de29b
diff --git a/example/.mvn/maven.config b/example/.mvn/maven.config
new file mode 100644
index 00000000..aff93939
--- /dev/null
+++ b/example/.mvn/maven.config
@@ -0,0 +1,13 @@
+# Copyright 2025-present MongoDB, Inc.
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#   http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
diff --git a/example/.mvn/wrapper/maven-wrapper.properties b/example/.mvn/wrapper/maven-wrapper.properties
new file mode 100644
index 00000000..c0b02622
--- /dev/null
+++ b/example/.mvn/wrapper/maven-wrapper.properties
@@ -0,0 +1,3 @@
+wrapperVersion=3.3.4
+distributionType=only-script
+distributionUrl=https://repo.maven.apache.org/maven2/org/apache/maven/apache-maven/4.0.0-rc-5/apache-maven-4.0.0-rc-5-bin.zip
diff --git a/example/mvnw b/example/mvnw
new file mode 100755
index 00000000..bd8896bf
--- /dev/null
+++ b/example/mvnw
@@ -0,0 +1,295 @@
+#!/bin/sh
+# ----------------------------------------------------------------------------
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements.  See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership.  The ASF licenses this file
+# to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance
+# with the License.  You may obtain a copy of the License at
+#
+#    http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing,
+# software distributed under the License is distributed on an
+# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+# KIND, either express or implied.  See the License for the
+# specific language governing permissions and limitations
+# under the License.
+# ----------------------------------------------------------------------------
+
+# ----------------------------------------------------------------------------
+# Apache Maven Wrapper startup batch script, version 3.3.4
+#
+# Optional ENV vars
+# -----------------
+#   JAVA_HOME - location of a JDK home dir, required when download maven via java source
+#   MVNW_REPOURL - repo url base for downloading maven distribution
+#   MVNW_USERNAME/MVNW_PASSWORD - user and password for downloading maven
+#   MVNW_VERBOSE - true: enable verbose log; debug: trace the mvnw script; others: silence the output
+# ----------------------------------------------------------------------------
+
+set -euf
+[ "${MVNW_VERBOSE-}" != debug ] || set -x
+
+# OS specific support.
+native_path() { printf %s\\n "$1"; }
+case "$(uname)" in
+CYGWIN* | MINGW*)
+  [ -z "${JAVA_HOME-}" ] || JAVA_HOME="$(cygpath --unix "$JAVA_HOME")"
+  native_path() { cygpath --path --windows "$1"; }
+  ;;
+esac
+
+# set JAVACMD and JAVACCMD
+set_java_home() {
+  # For Cygwin and MinGW, ensure paths are in Unix format before anything is touched
+  if [ -n "${JAVA_HOME-}" ]; then
+    if [ -x "$JAVA_HOME/jre/sh/java" ]; then
+      # IBM's JDK on AIX uses strange locations for the executables
+      JAVACMD="$JAVA_HOME/jre/sh/java"
+      JAVACCMD="$JAVA_HOME/jre/sh/javac"
+    else
+      JAVACMD="$JAVA_HOME/bin/java"
+      JAVACCMD="$JAVA_HOME/bin/javac"
+
+      if [ ! -x "$JAVACMD" ] || [ ! -x "$JAVACCMD" ]; then
+        echo "The JAVA_HOME environment variable is not defined correctly, so mvnw cannot run." >&2
+        echo "JAVA_HOME is set to \"$JAVA_HOME\", but \"\$JAVA_HOME/bin/java\" or \"\$JAVA_HOME/bin/javac\" does not exist." >&2
+        return 1
+      fi
+    fi
+  else
+    JAVACMD="$(
+      'set' +e
+      'unset' -f command 2>/dev/null
+      'command' -v java
+    )" || :
+    JAVACCMD="$(
+      'set' +e
+      'unset' -f command 2>/dev/null
+      'command' -v javac
+    )" || :
+
+    if [ ! -x "${JAVACMD-}" ] || [ ! -x "${JAVACCMD-}" ]; then
+      echo "The java/javac command does not exist in PATH nor is JAVA_HOME set, so mvnw cannot run." >&2
+      return 1
+    fi
+  fi
+}
+
+# hash string like Java String::hashCode
+hash_string() {
+  str="${1:-}" h=0
+  while [ -n "$str" ]; do
+    char="${str%"${str#?}"}"
+    h=$(((h * 31 + $(LC_CTYPE=C printf %d "'$char")) % 4294967296))
+    str="${str#?}"
+  done
+  printf %x\\n $h
+}
+
+verbose() { :; }
+[ "${MVNW_VERBOSE-}" != true ] || verbose() { printf %s\\n "${1-}"; }
+
+die() {
+  printf %s\\n "$1" >&2
+  exit 1
+}
+
+trim() {
+  # MWRAPPER-139:
+  #   Trims trailing and leading whitespace, carriage returns, tabs, and linefeeds.
+  #   Needed for removing poorly interpreted newline sequences when running in more
+  #   exotic environments such as mingw bash on Windows.
+  printf "%s" "${1}" | tr -d '[:space:]'
+}
+
+scriptDir="$(dirname "$0")"
+scriptName="$(basename "$0")"
+
+# parse distributionUrl and optional distributionSha256Sum, requires .mvn/wrapper/maven-wrapper.properties
+while IFS="=" read -r key value; do
+  case "${key-}" in
+  distributionUrl) distributionUrl=$(trim "${value-}") ;;
+  distributionSha256Sum) distributionSha256Sum=$(trim "${value-}") ;;
+  esac
+done <"$scriptDir/.mvn/wrapper/maven-wrapper.properties"
+[ -n "${distributionUrl-}" ] || die "cannot read distributionUrl property in $scriptDir/.mvn/wrapper/maven-wrapper.properties"
+
+case "${distributionUrl##*/}" in
+maven-mvnd-*bin.*)
+  MVN_CMD=mvnd.sh _MVNW_REPO_PATTERN=/maven/mvnd/
+  case "${PROCESSOR_ARCHITECTURE-}${PROCESSOR_ARCHITEW6432-}:$(uname -a)" in
+  *AMD64:CYGWIN* | *AMD64:MINGW*) distributionPlatform=windows-amd64 ;;
+  :Darwin*x86_64) distributionPlatform=darwin-amd64 ;;
+  :Darwin*arm64) distributionPlatform=darwin-aarch64 ;;
+  :Linux*x86_64*) distributionPlatform=linux-amd64 ;;
+  *)
+    echo "Cannot detect native platform for mvnd on $(uname)-$(uname -m), use pure java version" >&2
+    distributionPlatform=linux-amd64
+    ;;
+  esac
+  distributionUrl="${distributionUrl%-bin.*}-$distributionPlatform.zip"
+  ;;
+maven-mvnd-*) MVN_CMD=mvnd.sh _MVNW_REPO_PATTERN=/maven/mvnd/ ;;
+*) MVN_CMD="mvn${scriptName#mvnw}" _MVNW_REPO_PATTERN=/org/apache/maven/ ;;
+esac
+
+# apply MVNW_REPOURL and calculate MAVEN_HOME
+# maven home pattern: ~/.m2/wrapper/dists/{apache-maven-,maven-mvnd--}/
+[ -z "${MVNW_REPOURL-}" ] || distributionUrl="$MVNW_REPOURL$_MVNW_REPO_PATTERN${distributionUrl#*"$_MVNW_REPO_PATTERN"}"
+distributionUrlName="${distributionUrl##*/}"
+distributionUrlNameMain="${distributionUrlName%.*}"
+distributionUrlNameMain="${distributionUrlNameMain%-bin}"
+MAVEN_USER_HOME="${MAVEN_USER_HOME:-${HOME}/.m2}"
+MAVEN_HOME="${MAVEN_USER_HOME}/wrapper/dists/${distributionUrlNameMain-}/$(hash_string "$distributionUrl")"
+
+exec_maven() {
+  unset MVNW_VERBOSE MVNW_USERNAME MVNW_PASSWORD MVNW_REPOURL || :
+  exec "$MAVEN_HOME/bin/$MVN_CMD" "$@" || die "cannot exec $MAVEN_HOME/bin/$MVN_CMD"
+}
+
+if [ -d "$MAVEN_HOME" ]; then
+  verbose "found existing MAVEN_HOME at $MAVEN_HOME"
+  exec_maven "$@"
+fi
+
+case "${distributionUrl-}" in
+*?-bin.zip | *?maven-mvnd-?*-?*.zip) ;;
+*) die "distributionUrl is not valid, must match *-bin.zip or maven-mvnd-*.zip, but found '${distributionUrl-}'" ;;
+esac
+
+# prepare tmp dir
+if TMP_DOWNLOAD_DIR="$(mktemp -d)" && [ -d "$TMP_DOWNLOAD_DIR" ]; then
+  clean() { rm -rf -- "$TMP_DOWNLOAD_DIR"; }
+  trap clean HUP INT TERM EXIT
+else
+  die "cannot create temp dir"
+fi
+
+mkdir -p -- "${MAVEN_HOME%/*}"
+
+# Download and Install Apache Maven
+verbose "Couldn't find MAVEN_HOME, downloading and installing it ..."
+verbose "Downloading from: $distributionUrl"
+verbose "Downloading to: $TMP_DOWNLOAD_DIR/$distributionUrlName"
+
+# select .zip or .tar.gz
+if ! command -v unzip >/dev/null; then
+  distributionUrl="${distributionUrl%.zip}.tar.gz"
+  distributionUrlName="${distributionUrl##*/}"
+fi
+
+# verbose opt
+__MVNW_QUIET_WGET=--quiet __MVNW_QUIET_CURL=--silent __MVNW_QUIET_UNZIP=-q __MVNW_QUIET_TAR=''
+[ "${MVNW_VERBOSE-}" != true ] || __MVNW_QUIET_WGET='' __MVNW_QUIET_CURL='' __MVNW_QUIET_UNZIP='' __MVNW_QUIET_TAR=v
+
+# normalize http auth
+case "${MVNW_PASSWORD:+has-password}" in
+'') MVNW_USERNAME='' MVNW_PASSWORD='' ;;
+has-password) [ -n "${MVNW_USERNAME-}" ] || MVNW_USERNAME='' MVNW_PASSWORD='' ;;
+esac
+
+if [ -z "${MVNW_USERNAME-}" ] && command -v wget >/dev/null; then
+  verbose "Found wget ... using wget"
+  wget ${__MVNW_QUIET_WGET:+"$__MVNW_QUIET_WGET"} "$distributionUrl" -O "$TMP_DOWNLOAD_DIR/$distributionUrlName" || die "wget: Failed to fetch $distributionUrl"
+elif [ -z "${MVNW_USERNAME-}" ] && command -v curl >/dev/null; then
+  verbose "Found curl ... using curl"
+  curl ${__MVNW_QUIET_CURL:+"$__MVNW_QUIET_CURL"} -f -L -o "$TMP_DOWNLOAD_DIR/$distributionUrlName" "$distributionUrl" || die "curl: Failed to fetch $distributionUrl"
+elif set_java_home; then
+  verbose "Falling back to use Java to download"
+  javaSource="$TMP_DOWNLOAD_DIR/Downloader.java"
+  targetZip="$TMP_DOWNLOAD_DIR/$distributionUrlName"
+  cat >"$javaSource" <<-END
+	public class Downloader extends java.net.Authenticator
+	{
+	  protected java.net.PasswordAuthentication getPasswordAuthentication()
+	  {
+	    return new java.net.PasswordAuthentication( System.getenv( "MVNW_USERNAME" ), System.getenv( "MVNW_PASSWORD" ).toCharArray() );
+	  }
+	  public static void main( String[] args ) throws Exception
+	  {
+	    setDefault( new Downloader() );
+	    java.nio.file.Files.copy( java.net.URI.create( args[0] ).toURL().openStream(), java.nio.file.Paths.get( args[1] ).toAbsolutePath().normalize() );
+	  }
+	}
+	END
+  # For Cygwin/MinGW, switch paths to Windows format before running javac and java
+  verbose " - Compiling Downloader.java ..."
+  "$(native_path "$JAVACCMD")" "$(native_path "$javaSource")" || die "Failed to compile Downloader.java"
+  verbose " - Running Downloader.java ..."
+  "$(native_path "$JAVACMD")" -cp "$(native_path "$TMP_DOWNLOAD_DIR")" Downloader "$distributionUrl" "$(native_path "$targetZip")"
+fi
+
+# If specified, validate the SHA-256 sum of the Maven distribution zip file
+if [ -n "${distributionSha256Sum-}" ]; then
+  distributionSha256Result=false
+  if [ "$MVN_CMD" = mvnd.sh ]; then
+    echo "Checksum validation is not supported for maven-mvnd." >&2
+    echo "Please disable validation by removing 'distributionSha256Sum' from your maven-wrapper.properties." >&2
+    exit 1
+  elif command -v sha256sum >/dev/null; then
+    if echo "$distributionSha256Sum  $TMP_DOWNLOAD_DIR/$distributionUrlName" | sha256sum -c - >/dev/null 2>&1; then
+      distributionSha256Result=true
+    fi
+  elif command -v shasum >/dev/null; then
+    if echo "$distributionSha256Sum  $TMP_DOWNLOAD_DIR/$distributionUrlName" | shasum -a 256 -c >/dev/null 2>&1; then
+      distributionSha256Result=true
+    fi
+  else
+    echo "Checksum validation was requested but neither 'sha256sum' or 'shasum' are available." >&2
+    echo "Please install either command, or disable validation by removing 'distributionSha256Sum' from your maven-wrapper.properties." >&2
+    exit 1
+  fi
+  if [ $distributionSha256Result = false ]; then
+    echo "Error: Failed to validate Maven distribution SHA-256, your Maven distribution might be compromised." >&2
+    echo "If you updated your Maven version, you need to update the specified distributionSha256Sum property." >&2
+    exit 1
+  fi
+fi
+
+# unzip and move
+if command -v unzip >/dev/null; then
+  unzip ${__MVNW_QUIET_UNZIP:+"$__MVNW_QUIET_UNZIP"} "$TMP_DOWNLOAD_DIR/$distributionUrlName" -d "$TMP_DOWNLOAD_DIR" || die "failed to unzip"
+else
+  tar xzf${__MVNW_QUIET_TAR:+"$__MVNW_QUIET_TAR"} "$TMP_DOWNLOAD_DIR/$distributionUrlName" -C "$TMP_DOWNLOAD_DIR" || die "failed to untar"
+fi
+
+# Find the actual extracted directory name (handles snapshots where filename != directory name)
+actualDistributionDir=""
+
+# First try the expected directory name (for regular distributions)
+if [ -d "$TMP_DOWNLOAD_DIR/$distributionUrlNameMain" ]; then
+  if [ -f "$TMP_DOWNLOAD_DIR/$distributionUrlNameMain/bin/$MVN_CMD" ]; then
+    actualDistributionDir="$distributionUrlNameMain"
+  fi
+fi
+
+# If not found, search for any directory with the Maven executable (for snapshots)
+if [ -z "$actualDistributionDir" ]; then
+  # enable globbing to iterate over items
+  set +f
+  for dir in "$TMP_DOWNLOAD_DIR"/*; do
+    if [ -d "$dir" ]; then
+      if [ -f "$dir/bin/$MVN_CMD" ]; then
+        actualDistributionDir="$(basename "$dir")"
+        break
+      fi
+    fi
+  done
+  set -f
+fi
+
+if [ -z "$actualDistributionDir" ]; then
+  verbose "Contents of $TMP_DOWNLOAD_DIR:"
+  verbose "$(ls -la "$TMP_DOWNLOAD_DIR")"
+  die "Could not find Maven distribution directory in extracted archive"
+fi
+
+verbose "Found extracted Maven distribution directory: $actualDistributionDir"
+printf %s\\n "$distributionUrl" >"$TMP_DOWNLOAD_DIR/$actualDistributionDir/mvnw.url"
+mv -- "$TMP_DOWNLOAD_DIR/$actualDistributionDir" "$MAVEN_HOME" || [ -d "$MAVEN_HOME" ] || die "fail to move MAVEN_HOME"
+
+clean || :
+exec_maven "$@"
diff --git a/example/mvnw.cmd b/example/mvnw.cmd
new file mode 100644
index 00000000..92450f93
--- /dev/null
+++ b/example/mvnw.cmd
@@ -0,0 +1,189 @@
+<# : batch portion
+@REM ----------------------------------------------------------------------------
+@REM Licensed to the Apache Software Foundation (ASF) under one
+@REM or more contributor license agreements.  See the NOTICE file
+@REM distributed with this work for additional information
+@REM regarding copyright ownership.  The ASF licenses this file
+@REM to you under the Apache License, Version 2.0 (the
+@REM "License"); you may not use this file except in compliance
+@REM with the License.  You may obtain a copy of the License at
+@REM
+@REM    http://www.apache.org/licenses/LICENSE-2.0
+@REM
+@REM Unless required by applicable law or agreed to in writing,
+@REM software distributed under the License is distributed on an
+@REM "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+@REM KIND, either express or implied.  See the License for the
+@REM specific language governing permissions and limitations
+@REM under the License.
+@REM ----------------------------------------------------------------------------
+
+@REM ----------------------------------------------------------------------------
+@REM Apache Maven Wrapper startup batch script, version 3.3.4
+@REM
+@REM Optional ENV vars
+@REM   MVNW_REPOURL - repo url base for downloading maven distribution
+@REM   MVNW_USERNAME/MVNW_PASSWORD - user and password for downloading maven
+@REM   MVNW_VERBOSE - true: enable verbose log; others: silence the output
+@REM ----------------------------------------------------------------------------
+
+@IF "%__MVNW_ARG0_NAME__%"=="" (SET __MVNW_ARG0_NAME__=%~nx0)
+@SET __MVNW_CMD__=
+@SET __MVNW_ERROR__=
+@SET __MVNW_PSMODULEP_SAVE=%PSModulePath%
+@SET PSModulePath=
+@FOR /F "usebackq tokens=1* delims==" %%A IN (`powershell -noprofile "& {$scriptDir='%~dp0'; $script='%__MVNW_ARG0_NAME__%'; icm -ScriptBlock ([Scriptblock]::Create((Get-Content -Raw '%~f0'))) -NoNewScope}"`) DO @(
+  IF "%%A"=="MVN_CMD" (set __MVNW_CMD__=%%B) ELSE IF "%%B"=="" (echo %%A) ELSE (echo %%A=%%B)
+)
+@SET PSModulePath=%__MVNW_PSMODULEP_SAVE%
+@SET __MVNW_PSMODULEP_SAVE=
+@SET __MVNW_ARG0_NAME__=
+@SET MVNW_USERNAME=
+@SET MVNW_PASSWORD=
+@IF NOT "%__MVNW_CMD__%"=="" ("%__MVNW_CMD__%" %*)
+@echo Cannot start maven from wrapper >&2 && exit /b 1
+@GOTO :EOF
+: end batch / begin powershell #>
+
+$ErrorActionPreference = "Stop"
+if ($env:MVNW_VERBOSE -eq "true") {
+  $VerbosePreference = "Continue"
+}
+
+# calculate distributionUrl, requires .mvn/wrapper/maven-wrapper.properties
+$distributionUrl = (Get-Content -Raw "$scriptDir/.mvn/wrapper/maven-wrapper.properties" | ConvertFrom-StringData).distributionUrl
+if (!$distributionUrl) {
+  Write-Error "cannot read distributionUrl property in $scriptDir/.mvn/wrapper/maven-wrapper.properties"
+}
+
+switch -wildcard -casesensitive ( $($distributionUrl -replace '^.*/','') ) {
+  "maven-mvnd-*" {
+    $USE_MVND = $true
+    $distributionUrl = $distributionUrl -replace '-bin\.[^.]*$',"-windows-amd64.zip"
+    $MVN_CMD = "mvnd.cmd"
+    break
+  }
+  default {
+    $USE_MVND = $false
+    $MVN_CMD = $script -replace '^mvnw','mvn'
+    break
+  }
+}
+
+# apply MVNW_REPOURL and calculate MAVEN_HOME
+# maven home pattern: ~/.m2/wrapper/dists/{apache-maven-,maven-mvnd--}/
+if ($env:MVNW_REPOURL) {
+  $MVNW_REPO_PATTERN = if ($USE_MVND -eq $False) { "/org/apache/maven/" } else { "/maven/mvnd/" }
+  $distributionUrl = "$env:MVNW_REPOURL$MVNW_REPO_PATTERN$($distributionUrl -replace "^.*$MVNW_REPO_PATTERN",'')"
+}
+$distributionUrlName = $distributionUrl -replace '^.*/',''
+$distributionUrlNameMain = $distributionUrlName -replace '\.[^.]*$','' -replace '-bin$',''
+
+$MAVEN_M2_PATH = "$HOME/.m2"
+if ($env:MAVEN_USER_HOME) {
+  $MAVEN_M2_PATH = "$env:MAVEN_USER_HOME"
+}
+
+if (-not (Test-Path -Path $MAVEN_M2_PATH)) {
+    New-Item -Path $MAVEN_M2_PATH -ItemType Directory | Out-Null
+}
+
+$MAVEN_WRAPPER_DISTS = $null
+if ((Get-Item $MAVEN_M2_PATH).Target[0] -eq $null) {
+  $MAVEN_WRAPPER_DISTS = "$MAVEN_M2_PATH/wrapper/dists"
+} else {
+  $MAVEN_WRAPPER_DISTS = (Get-Item $MAVEN_M2_PATH).Target[0] + "/wrapper/dists"
+}
+
+$MAVEN_HOME_PARENT = "$MAVEN_WRAPPER_DISTS/$distributionUrlNameMain"
+$MAVEN_HOME_NAME = ([System.Security.Cryptography.SHA256]::Create().ComputeHash([byte[]][char[]]$distributionUrl) | ForEach-Object {$_.ToString("x2")}) -join ''
+$MAVEN_HOME = "$MAVEN_HOME_PARENT/$MAVEN_HOME_NAME"
+
+if (Test-Path -Path "$MAVEN_HOME" -PathType Container) {
+  Write-Verbose "found existing MAVEN_HOME at $MAVEN_HOME"
+  Write-Output "MVN_CMD=$MAVEN_HOME/bin/$MVN_CMD"
+  exit $?
+}
+
+if (! $distributionUrlNameMain -or ($distributionUrlName -eq $distributionUrlNameMain)) {
+  Write-Error "distributionUrl is not valid, must end with *-bin.zip, but found $distributionUrl"
+}
+
+# prepare tmp dir
+$TMP_DOWNLOAD_DIR_HOLDER = New-TemporaryFile
+$TMP_DOWNLOAD_DIR = New-Item -Itemtype Directory -Path "$TMP_DOWNLOAD_DIR_HOLDER.dir"
+$TMP_DOWNLOAD_DIR_HOLDER.Delete() | Out-Null
+trap {
+  if ($TMP_DOWNLOAD_DIR.Exists) {
+    try { Remove-Item $TMP_DOWNLOAD_DIR -Recurse -Force | Out-Null }
+    catch { Write-Warning "Cannot remove $TMP_DOWNLOAD_DIR" }
+  }
+}
+
+New-Item -Itemtype Directory -Path "$MAVEN_HOME_PARENT" -Force | Out-Null
+
+# Download and Install Apache Maven
+Write-Verbose "Couldn't find MAVEN_HOME, downloading and installing it ..."
+Write-Verbose "Downloading from: $distributionUrl"
+Write-Verbose "Downloading to: $TMP_DOWNLOAD_DIR/$distributionUrlName"
+
+$webclient = New-Object System.Net.WebClient
+if ($env:MVNW_USERNAME -and $env:MVNW_PASSWORD) {
+  $webclient.Credentials = New-Object System.Net.NetworkCredential($env:MVNW_USERNAME, $env:MVNW_PASSWORD)
+}
+[Net.ServicePointManager]::SecurityProtocol = [Net.SecurityProtocolType]::Tls12
+$webclient.DownloadFile($distributionUrl, "$TMP_DOWNLOAD_DIR/$distributionUrlName") | Out-Null
+
+# If specified, validate the SHA-256 sum of the Maven distribution zip file
+$distributionSha256Sum = (Get-Content -Raw "$scriptDir/.mvn/wrapper/maven-wrapper.properties" | ConvertFrom-StringData).distributionSha256Sum
+if ($distributionSha256Sum) {
+  if ($USE_MVND) {
+    Write-Error "Checksum validation is not supported for maven-mvnd. `nPlease disable validation by removing 'distributionSha256Sum' from your maven-wrapper.properties."
+  }
+  Import-Module $PSHOME\Modules\Microsoft.PowerShell.Utility -Function Get-FileHash
+  if ((Get-FileHash "$TMP_DOWNLOAD_DIR/$distributionUrlName" -Algorithm SHA256).Hash.ToLower() -ne $distributionSha256Sum) {
+    Write-Error "Error: Failed to validate Maven distribution SHA-256, your Maven distribution might be compromised. If you updated your Maven version, you need to update the specified distributionSha256Sum property."
+  }
+}
+
+# unzip and move
+Expand-Archive "$TMP_DOWNLOAD_DIR/$distributionUrlName" -DestinationPath "$TMP_DOWNLOAD_DIR" | Out-Null
+
+# Find the actual extracted directory name (handles snapshots where filename != directory name)
+$actualDistributionDir = ""
+
+# First try the expected directory name (for regular distributions)
+$expectedPath = Join-Path "$TMP_DOWNLOAD_DIR" "$distributionUrlNameMain"
+$expectedMvnPath = Join-Path "$expectedPath" "bin/$MVN_CMD"
+if ((Test-Path -Path $expectedPath -PathType Container) -and (Test-Path -Path $expectedMvnPath -PathType Leaf)) {
+  $actualDistributionDir = $distributionUrlNameMain
+}
+
+# If not found, search for any directory with the Maven executable (for snapshots)
+if (!$actualDistributionDir) {
+  Get-ChildItem -Path "$TMP_DOWNLOAD_DIR" -Directory | ForEach-Object {
+    $testPath = Join-Path $_.FullName "bin/$MVN_CMD"
+    if (Test-Path -Path $testPath -PathType Leaf) {
+      $actualDistributionDir = $_.Name
+    }
+  }
+}
+
+if (!$actualDistributionDir) {
+  Write-Error "Could not find Maven distribution directory in extracted archive"
+}
+
+Write-Verbose "Found extracted Maven distribution directory: $actualDistributionDir"
+Rename-Item -Path "$TMP_DOWNLOAD_DIR/$actualDistributionDir" -NewName $MAVEN_HOME_NAME | Out-Null
+try {
+  Move-Item -Path "$TMP_DOWNLOAD_DIR/$MAVEN_HOME_NAME" -Destination $MAVEN_HOME_PARENT | Out-Null
+} catch {
+  if (! (Test-Path -Path "$MAVEN_HOME" -PathType Container)) {
+    Write-Error "fail to move MAVEN_HOME"
+  }
+} finally {
+  try { Remove-Item $TMP_DOWNLOAD_DIR -Recurse -Force | Out-Null }
+  catch { Write-Warning "Cannot remove $TMP_DOWNLOAD_DIR" }
+}
+
+Write-Output "MVN_CMD=$MAVEN_HOME/bin/$MVN_CMD"
diff --git a/example/pom.xml b/example/pom.xml
new file mode 100644
index 00000000..6485f21b
--- /dev/null
+++ b/example/pom.xml
@@ -0,0 +1,267 @@
+
+
+
+
+    4.0.0
+    org.mongodb
+    mongodb-hibernate-example
+    ${projectVersion}
+    mongodb-hibernate-example
+    https://www.mongodb.com/
+    
+        
+            Apache License, Version 2.0
+            https://www.apache.org/licenses/LICENSE-2.0
+        
+    
+    
+        https://github.com/mongodb/mongo-hibernate
+        scm:git:https://github.com/mongodb/mongo-hibernate.git
+        scm:git:https://github.com/mongodb/mongo-hibernate.git
+    
+    
+        UTF-8
+        ${project.build.sourceEncoding}
+        -Xverify:all
+    
+    
+        
+            
+                ch.qos.logback
+                logback-classic
+                1.5.21
+            
+            
+                org.mongodb
+                mongodb-hibernate
+                ${projectVersion}
+            
+            
+                org.jboss.logging
+                jboss-logging
+                3.5.3.Final
+            
+            
+                jakarta.transaction
+                jakarta.transaction-api
+                2.0.1
+            
+            
+                jakarta.enterprise
+                jakarta.enterprise.cdi-api
+                4.1.0
+            
+            
+                org.hibernate.common
+                hibernate-commons-annotations
+                7.0.3.Final
+            
+            
+                com.fasterxml
+                classmate
+                1.7.1
+            
+            
+                jakarta.xml.bind
+                jakarta.xml.bind-api
+                4.0.4
+            
+            
+                net.bytebuddy
+                byte-buddy
+                1.18.1
+            
+            
+                org.junit
+                junit-bom
+                6.0.1
+                pom
+                import
+            
+            
+                org.assertj
+                assertj-core
+                3.27.6
+                test
+            
+        
+    
+    
+        
+            ch.qos.logback
+            logback-classic
+        
+        
+            org.mongodb
+            mongodb-hibernate
+        
+        
+            org.jboss.logging
+            jboss-logging
+        
+        
+            jakarta.transaction
+            jakarta.transaction-api
+        
+        
+            jakarta.enterprise
+            jakarta.enterprise.cdi-api
+        
+        
+            org.hibernate.common
+            hibernate-commons-annotations
+        
+        
+            com.fasterxml
+            classmate
+        
+        
+            jakarta.xml.bind
+            jakarta.xml.bind-api
+        
+        
+            net.bytebuddy
+            byte-buddy
+        
+        
+            org.junit.jupiter
+            junit-jupiter
+            test
+        
+        
+            org.assertj
+            assertj-core
+        
+    
+    
+        
+            
+                
+                    maven-clean-plugin
+                    3.5.0
+                
+                
+                    maven-resources-plugin
+                    3.3.1
+                
+                
+                    maven-compiler-plugin
+                    3.14.1
+                    
+                        ${javaVersion}
+                        true
+                        lines,vars,source
+                        true
+                        true
+                        
+                            -Werror
+                            -Xlint:all
+                            -Xlint:-requires-automatic
+                        
+                    
+                
+                
+                    maven-surefire-plugin
+                    3.5.4
+                    
+                        1
+                        true
+                        true
+                        ${mongodb-hibernate-example.test.argLine}
+                        
+                            
+                                
+                            
+                        
+                    
+                
+                
+                    maven-failsafe-plugin
+                    3.5.4
+                    
+                        
+                            integration-test
+                            
+                                integration-test
+                                verify
+                            
+                            
+                                1
+                                true
+                                true
+                                ${mongodb-hibernate-example.test.argLine}
+                                
+                                    **/*IntegrationTests.java
+                                
+                            
+                        
+                    
+                
+                
+                    maven-jar-plugin
+                    3.4.2
+                
+                
+                    maven-install-plugin
+                    3.1.2
+                
+                
+                    org.codehaus.mojo
+                    exec-maven-plugin
+                    3.6.2
+                    
+                        
+                            execute-AppWithMongoConfiguratorContributorAddedViaServiceContributor
+                            integration-test
+                            
+                                java
+                            
+                            
+                                com.mongodb.hibernate.example/com.mongodb.hibernate.example.AppWithMongoConfiguratorContributorAddedViaServiceContributor
+                                false
+                            
+                        
+                        
+                            execute-AppWithMongoConfiguratorContributorAddedDirectly
+                            integration-test
+                            
+                                java
+                            
+                            
+                                com.mongodb.hibernate.example/com.mongodb.hibernate.example.AppWithMongoConfiguratorContributorAddedDirectly
+                                false
+                            
+                        
+                    
+                
+            
+        
+        
+            
+                org.apache.maven.plugins
+                maven-failsafe-plugin
+            
+            
+                org.codehaus.mojo
+                exec-maven-plugin
+            
+        
+    
+
diff --git a/example/src/main/java/com/mongodb/hibernate/example/AppWithMongoConfiguratorContributorAddedDirectly.java b/example/src/main/java/com/mongodb/hibernate/example/AppWithMongoConfiguratorContributorAddedDirectly.java
new file mode 100644
index 00000000..fa8f9f03
--- /dev/null
+++ b/example/src/main/java/com/mongodb/hibernate/example/AppWithMongoConfiguratorContributorAddedDirectly.java
@@ -0,0 +1,97 @@
+/*
+ * Copyright 2025-present MongoDB, Inc.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.mongodb.hibernate.example;
+
+import com.mongodb.ServerAddress;
+import com.mongodb.client.model.Aggregates;
+import com.mongodb.client.model.Filters;
+import com.mongodb.connection.ClusterConnectionMode;
+import com.mongodb.hibernate.example.model.Item;
+import com.mongodb.hibernate.service.spi.MongoConfigurationContributor;
+import org.bson.BsonArray;
+import org.bson.BsonDocument;
+import org.bson.BsonString;
+import org.bson.json.JsonMode;
+import org.bson.json.JsonWriterSettings;
+import org.bson.types.ObjectId;
+import org.hibernate.SessionFactory;
+import org.hibernate.boot.MetadataSources;
+import org.hibernate.boot.registry.StandardServiceRegistryBuilder;
+import org.hibernate.cfg.AvailableSettings;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import java.util.ArrayList;
+import java.util.List;
+
+final class AppWithMongoConfiguratorContributorAddedDirectly {
+    private static final Logger LOGGER = LoggerFactory.getLogger(Logger.ROOT_LOGGER_NAME);
+
+    public static void main(String... args) {
+        try (var sessionFactory = new MetadataSources()
+                // add metadata sources, for example, by calling `addAnnotatedClasses`
+                // ...
+                .addAnnotatedClasses(Item.class)
+                .getMetadataBuilder(new StandardServiceRegistryBuilder()
+                        .applySetting(AvailableSettings.DIALECT, "com.mongodb.hibernate.dialect.MongoDialect")
+                        .applySetting(AvailableSettings.CONNECTION_PROVIDER, "com.mongodb.hibernate.jdbc.MongoConnectionProvider")
+                        .applySetting(AvailableSettings.STATEMENT_BATCH_SIZE, 2)
+                        .addService(MongoConfigurationContributor.class, configurator ->
+                                configurator.applyToMongoClientSettings(mongoClientSettings -> mongoClientSettings
+                                                .applyToClusterSettings(clusterSettings -> clusterSettings
+                                                        .hosts(List.of(new ServerAddress("localhost", 27017)))
+                                                        .mode(ClusterConnectionMode.MULTIPLE))
+                                                .build())
+                                        .databaseName("example"))
+                        .build())
+                .build()
+                .buildSessionFactory()) {
+            // use `sessionFactory`
+            // ...
+            useSessionFactory(sessionFactory);
+        }
+    }
+
+    static void useSessionFactory(SessionFactory sessionFactory) {
+        sessionFactory.inTransaction(session -> session.createMutationQuery("delete from Item").executeUpdate());
+        LOGGER.info("Deleted using HQL all `{}`s", Item.class.getSimpleName());
+        var ids = sessionFactory.fromTransaction(session -> {
+            var result = new ArrayList();
+            var itemWithExplicitId = new Item(new ObjectId());
+            {
+                session.persist(itemWithExplicitId);
+                result.add(itemWithExplicitId.getId());
+            }
+            var itemWithGeneratedId = new Item().setDescription("with auto-generated ID");
+            {
+                session.persist(itemWithGeneratedId);
+                result.add(itemWithGeneratedId.getId());
+            }
+            return result;
+        });
+        LOGGER.info("Persisted using API `{}`s with identifiers {}", Item.class.getSimpleName(), ids);
+        sessionFactory.inTransaction(session -> {
+            var mql = new BsonDocument("aggregate", new BsonString(Item.COLLECTION_NAME))
+                    .append("pipeline", new BsonArray(List.of(
+                            Aggregates.match(Filters.in("_id", ids)).toBsonDocument(),
+                            Item.projectAll())))
+                    .toJson(JsonWriterSettings.builder().outputMode(JsonMode.EXTENDED).build());
+            var items = session.createNativeQuery(mql, Item.class).getResultList();
+            LOGGER.info("Found using MQL {}", items);
+        });
+    }
+}
diff --git a/example/src/main/java/com/mongodb/hibernate/example/AppWithMongoConfiguratorContributorAddedViaServiceContributor.java b/example/src/main/java/com/mongodb/hibernate/example/AppWithMongoConfiguratorContributorAddedViaServiceContributor.java
new file mode 100644
index 00000000..fa0f53bc
--- /dev/null
+++ b/example/src/main/java/com/mongodb/hibernate/example/AppWithMongoConfiguratorContributorAddedViaServiceContributor.java
@@ -0,0 +1,91 @@
+/*
+ * Copyright 2025-present MongoDB, Inc.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.mongodb.hibernate.example;
+
+import com.mongodb.ServerAddress;
+import com.mongodb.connection.ClusterConnectionMode;
+import com.mongodb.hibernate.cfg.MongoConfigurator;
+import com.mongodb.hibernate.example.model.Item;
+import com.mongodb.hibernate.service.spi.MongoConfigurationContributor;
+import org.hibernate.boot.MetadataSources;
+import org.hibernate.boot.registry.StandardServiceInitiator;
+import org.hibernate.boot.registry.StandardServiceRegistryBuilder;
+import org.hibernate.cfg.AvailableSettings;
+import org.hibernate.service.spi.ServiceRegistryImplementor;
+
+import java.io.Serial;
+import java.util.List;
+import java.util.Map;
+
+import static com.mongodb.hibernate.example.AppWithMongoConfiguratorContributorAddedDirectly.useSessionFactory;
+
+public final class AppWithMongoConfiguratorContributorAddedViaServiceContributor {
+    public static void main(String... args) {
+        try (var sessionFactory = new MetadataSources()
+                // add metadata sources, for example, by calling `addAnnotatedClasses`
+                // ...
+                .addAnnotatedClasses(Item.class)
+                .getMetadataBuilder(new StandardServiceRegistryBuilder()
+                        .applySetting(AvailableSettings.DIALECT, "com.mongodb.hibernate.dialect.MongoDialect")
+                        .applySetting(AvailableSettings.CONNECTION_PROVIDER, "com.mongodb.hibernate.jdbc.MongoConnectionProvider")
+                        .applySetting(AvailableSettings.STATEMENT_BATCH_SIZE, 2)
+                        .build())
+                .build()
+                .buildSessionFactory()) {
+            // use `sessionFactory`
+            // ...
+            useSessionFactory(sessionFactory);
+        }
+    }
+
+    public static final class MyMongoConfigurationContributor implements MongoConfigurationContributor {
+        @Serial
+        private static final long serialVersionUID = 1L;
+
+        private MyMongoConfigurationContributor() {}
+
+        @Override
+        public void configure(MongoConfigurator configurator) {
+            configurator.applyToMongoClientSettings(mongoClientSettings -> mongoClientSettings
+                            .applyToClusterSettings(clusterSettings -> clusterSettings
+                                    .hosts(List.of(new ServerAddress("localhost", 27017)))
+                                    .mode(ClusterConnectionMode.MULTIPLE))
+                            .build())
+                    .databaseName("example");
+        }
+
+        public static final class ServiceContributor implements org.hibernate.service.spi.ServiceContributor {
+            public ServiceContributor() {}
+
+            @Override
+            public void contribute(StandardServiceRegistryBuilder serviceRegistryBuilder) {
+                serviceRegistryBuilder.addInitiator(new StandardServiceInitiator() {
+                    @Override
+                    public Class getServiceInitiated() {
+                        return MongoConfigurationContributor.class;
+                    }
+
+                    @Override
+                    public MongoConfigurationContributor initiateService(
+                            Map configurationValues, ServiceRegistryImplementor serviceRegistry) {
+                        return new MyMongoConfigurationContributor();
+                    }
+                });
+            }
+        }
+    }
+}
diff --git a/example/src/main/java/com/mongodb/hibernate/example/model/Item.java b/example/src/main/java/com/mongodb/hibernate/example/model/Item.java
new file mode 100644
index 00000000..35384cb7
--- /dev/null
+++ b/example/src/main/java/com/mongodb/hibernate/example/model/Item.java
@@ -0,0 +1,76 @@
+/*
+ * Copyright 2025-present MongoDB, Inc.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.mongodb.hibernate.example.model;
+
+import com.mongodb.client.model.Aggregates;
+import com.mongodb.client.model.Projections;
+import com.mongodb.hibernate.annotations.ObjectIdGenerator;
+import jakarta.persistence.Entity;
+import jakarta.persistence.Id;
+import jakarta.persistence.Table;
+import org.bson.BsonDocument;
+import org.bson.types.ObjectId;
+
+import static com.mongodb.hibernate.example.model.Item.COLLECTION_NAME;
+
+@Entity
+@Table(name = COLLECTION_NAME)
+public class Item {
+    public static final String COLLECTION_NAME = "items";
+
+    @Id
+    @ObjectIdGenerator
+    private final ObjectId id;
+    private String description;
+
+    public Item() {
+        id = null;
+        description = null;
+    }
+
+    public Item(ObjectId id) {
+        this.id = id;
+    }
+
+    public ObjectId getId() {
+        return id;
+    }
+
+    public Item setDescription(String description) {
+        this.description = description;
+        return this;
+    }
+
+    public String getDescription() {
+        return description;
+    }
+
+    @Override
+    public String toString() {
+        return "Item{"
+                + "id=" + id
+                + ", description=" + description
+                + '}';
+    }
+
+    public static BsonDocument projectAll() {
+        return Aggregates.project(Projections.include(
+                "_id",
+                "description"))
+                .toBsonDocument();
+    }
+}
diff --git a/example/src/main/java/module-info.java b/example/src/main/java/module-info.java
new file mode 100644
index 00000000..4073193a
--- /dev/null
+++ b/example/src/main/java/module-info.java
@@ -0,0 +1,37 @@
+/*
+ * Copyright 2025-present MongoDB, Inc.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+import com.mongodb.hibernate.example.AppWithMongoConfiguratorContributorAddedViaServiceContributor;
+import org.hibernate.service.spi.ServiceContributor;
+
+module com.mongodb.hibernate.example {
+    requires org.slf4j;
+    requires jakarta.persistence;
+    requires com.mongodb.hibernate;
+    requires org.mongodb.bson;
+    opens com.mongodb.hibernate.example.model
+            to org.hibernate.orm.core;
+    provides ServiceContributor
+            with AppWithMongoConfiguratorContributorAddedViaServiceContributor.MyMongoConfigurationContributor.ServiceContributor;
+    // The following directives are here only to help `exec-maven-plugin` figure out the dependencies.
+    // This seems to be caused by a problem with `exec-maven-plugin`.
+    requires org.jboss.logging;
+    requires jakarta.transaction;
+    requires org.hibernate.commons.annotations;
+    requires com.fasterxml.classmate;
+    requires jakarta.xml.bind;
+    requires net.bytebuddy;
+}
diff --git a/example/src/main/resources/META-INF/services/org.hibernate.service.spi.ServiceContributor b/example/src/main/resources/META-INF/services/org.hibernate.service.spi.ServiceContributor
new file mode 100644
index 00000000..33d6a55a
--- /dev/null
+++ b/example/src/main/resources/META-INF/services/org.hibernate.service.spi.ServiceContributor
@@ -0,0 +1 @@
+com.mongodb.hibernate.example.AppWithMongoConfiguratorContributorAddedViaServiceContributor$MyMongoConfigurationContributor$ServiceContributor
diff --git a/example/src/main/resources/logback.xml b/example/src/main/resources/logback.xml
new file mode 100644
index 00000000..c9057a4a
--- /dev/null
+++ b/example/src/main/resources/logback.xml
@@ -0,0 +1,30 @@
+
+
+
+
+
+    
+    
+    
+        
+            %date{STRICT, Etc/UTC, en-US} [%thread] %level %logger{36} - %message%n
+        
+    
+    
+        
+    
+
diff --git a/example/src/test/java/com/mongodb/hibernate/example/AppWithMongoConfiguratorContributorAddedDirectlyIntegrationTests.java b/example/src/test/java/com/mongodb/hibernate/example/AppWithMongoConfiguratorContributorAddedDirectlyIntegrationTests.java
new file mode 100644
index 00000000..4f0f9b61
--- /dev/null
+++ b/example/src/test/java/com/mongodb/hibernate/example/AppWithMongoConfiguratorContributorAddedDirectlyIntegrationTests.java
@@ -0,0 +1,26 @@
+/*
+ * Copyright 2025-present MongoDB, Inc.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.mongodb.hibernate.example;
+
+import org.junit.jupiter.api.Test;
+
+final class AppWithMongoConfiguratorContributorAddedDirectlyIntegrationTests {
+    @Test
+    void testMain() {
+        AppWithMongoConfiguratorContributorAddedDirectly.main();
+    }
+}
diff --git a/example/src/test/java/com/mongodb/hibernate/example/AppWithMongoConfiguratorContributorAddedViaServiceContributorIntegrationTests.java b/example/src/test/java/com/mongodb/hibernate/example/AppWithMongoConfiguratorContributorAddedViaServiceContributorIntegrationTests.java
new file mode 100644
index 00000000..862682f5
--- /dev/null
+++ b/example/src/test/java/com/mongodb/hibernate/example/AppWithMongoConfiguratorContributorAddedViaServiceContributorIntegrationTests.java
@@ -0,0 +1,26 @@
+/*
+ * Copyright 2025-present MongoDB, Inc.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.mongodb.hibernate.example;
+
+import org.junit.jupiter.api.Test;
+
+final class AppWithMongoConfiguratorContributorAddedViaServiceContributorIntegrationTests {
+    @Test
+    void testMain() {
+        AppWithMongoConfiguratorContributorAddedViaServiceContributor.main();
+    }
+}
diff --git a/example/src/test/java/com/mongodb/hibernate/example/MongoAdditionalMappingContributorTests.java b/example/src/test/java/com/mongodb/hibernate/example/MongoAdditionalMappingContributorTests.java
new file mode 100644
index 00000000..f734cbc3
--- /dev/null
+++ b/example/src/test/java/com/mongodb/hibernate/example/MongoAdditionalMappingContributorTests.java
@@ -0,0 +1,59 @@
+/*
+ * Copyright 2025-present MongoDB, Inc.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.mongodb.hibernate.example;
+
+import jakarta.persistence.Embeddable;
+import jakarta.persistence.Entity;
+import jakarta.persistence.Id;
+import jakarta.persistence.Table;
+import org.hibernate.boot.MetadataSources;
+import org.hibernate.boot.registry.StandardServiceRegistryBuilder;
+import org.hibernate.cfg.AvailableSettings;
+import org.junit.jupiter.api.Test;
+
+import static org.assertj.core.api.Assertions.assertThatThrownBy;
+
+final class MongoAdditionalMappingContributorTests {
+    @Test
+    void testContribute() {
+        assertThatThrownBy(() -> new MetadataSources()
+                .addAnnotatedClass(Item.class)
+                .buildMetadata(new StandardServiceRegistryBuilder()
+                        .applySetting(AvailableSettings.DIALECT, "com.mongodb.hibernate.dialect.MongoDialect")
+                        .applySetting(AvailableSettings.CONNECTION_PROVIDER, "com.mongodb.hibernate.jdbc.MongoConnectionProvider")
+                        .applySetting(AvailableSettings.ALLOW_METADATA_ON_BOOT, false)
+                        .applySetting(AvailableSettings.JAKARTA_JDBC_URL, "mongodb://host/db")
+                        .build()))
+                .hasMessageContaining("does not support primary key spanning multiple columns");
+    }
+
+    @Entity
+    @Table(name = Item.COLLECTION_NAME)
+    static class Item {
+        static final String COLLECTION_NAME = "items";
+
+        @Id
+        MultipleColumns id;
+
+        Item(MultipleColumns id) {
+            this.id = id;
+        }
+
+        @Embeddable
+        record MultipleColumns(int a, int b) {}
+    }
+}