This is an automated email from the ASF dual-hosted git repository.
yuqi4733 pushed a commit to branch branch-0.9
in repository https://gitbox.apache.org/repos/asf/gravitino.git
The following commit(s) were added to refs/heads/branch-0.9 by this push:
new 8afd3a096a [#7529] improvement(core): use SPI to auto register mappers
(#7532)
8afd3a096a is described below
commit 8afd3a096a9885b7e324ffd2a86fac713ff10801
Author: github-actions[bot]
<41898282+github-actions[bot]@users.noreply.github.com>
AuthorDate: Tue Jul 1 21:32:21 2025 +0800
[#7529] improvement(core): use SPI to auto register mappers (#7532)
### What changes were proposed in this pull request?
use SPI to auto register mappers
### Why are the changes needed?
Fix: #7529
### Does this PR introduce _any_ user-facing change?
no
### How was this patch tested?
CI pass
Co-authored-by: mchades <[email protected]>
---
.../provider/DefaultMapperPackageProvider.java | 30 ++++++++++++++
.../mapper/provider/MapperPackageProvider.java | 33 ++++++++++++++++
.../session/SqlSessionFactoryHelper.java | 46 +++-------------------
...elational.mapper.provider.MapperPackageProvider | 19 +++++++++
4 files changed, 88 insertions(+), 40 deletions(-)
diff --git
a/core/src/main/java/org/apache/gravitino/storage/relational/mapper/provider/DefaultMapperPackageProvider.java
b/core/src/main/java/org/apache/gravitino/storage/relational/mapper/provider/DefaultMapperPackageProvider.java
new file mode 100644
index 0000000000..17f316408b
--- /dev/null
+++
b/core/src/main/java/org/apache/gravitino/storage/relational/mapper/provider/DefaultMapperPackageProvider.java
@@ -0,0 +1,30 @@
+/*
+ * 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.
+ */
+package org.apache.gravitino.storage.relational.mapper.provider;
+
+/** The default provider that supplies the primary mapper package for
Gravitino. */
+public class DefaultMapperPackageProvider implements MapperPackageProvider {
+ private static final String DEFAULT_MAPPER_PACKAGE =
+ "org.apache.gravitino.storage.relational.mapper";
+
+ @Override
+ public String getPackageName() {
+ return DEFAULT_MAPPER_PACKAGE;
+ }
+}
diff --git
a/core/src/main/java/org/apache/gravitino/storage/relational/mapper/provider/MapperPackageProvider.java
b/core/src/main/java/org/apache/gravitino/storage/relational/mapper/provider/MapperPackageProvider.java
new file mode 100644
index 0000000000..47c4c33eaf
--- /dev/null
+++
b/core/src/main/java/org/apache/gravitino/storage/relational/mapper/provider/MapperPackageProvider.java
@@ -0,0 +1,33 @@
+/*
+ * 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.
+ */
+package org.apache.gravitino.storage.relational.mapper.provider;
+
+/**
+ * A Service Provider Interface (SPI) for providing package names that contain
MyBatis Mapper
+ * interfaces. Implementations of this interface allow for the automatic
discovery and registration
+ * of mappers from different modules.
+ */
+public interface MapperPackageProvider {
+ /**
+ * Returns the package name where MyBatis Mapper interfaces are located.
+ *
+ * @return A string representing the package name to be scanned.
+ */
+ String getPackageName();
+}
diff --git
a/core/src/main/java/org/apache/gravitino/storage/relational/session/SqlSessionFactoryHelper.java
b/core/src/main/java/org/apache/gravitino/storage/relational/session/SqlSessionFactoryHelper.java
index fb870bc7f7..2040ecba9a 100644
---
a/core/src/main/java/org/apache/gravitino/storage/relational/session/SqlSessionFactoryHelper.java
+++
b/core/src/main/java/org/apache/gravitino/storage/relational/session/SqlSessionFactoryHelper.java
@@ -22,6 +22,7 @@ package org.apache.gravitino.storage.relational.session;
import com.google.common.base.Preconditions;
import java.sql.SQLException;
import java.time.Duration;
+import java.util.ServiceLoader;
import org.apache.commons.dbcp2.BasicDataSource;
import org.apache.commons.pool2.impl.BaseObjectPoolConfig;
import org.apache.gravitino.Config;
@@ -30,26 +31,7 @@ import org.apache.gravitino.GravitinoEnv;
import org.apache.gravitino.metrics.MetricsSystem;
import org.apache.gravitino.metrics.source.RelationDatasourceMetricsSource;
import org.apache.gravitino.storage.relational.JDBCBackend.JDBCBackendType;
-import org.apache.gravitino.storage.relational.mapper.CatalogMetaMapper;
-import org.apache.gravitino.storage.relational.mapper.FilesetMetaMapper;
-import org.apache.gravitino.storage.relational.mapper.FilesetVersionMapper;
-import org.apache.gravitino.storage.relational.mapper.GroupMetaMapper;
-import org.apache.gravitino.storage.relational.mapper.GroupRoleRelMapper;
-import org.apache.gravitino.storage.relational.mapper.MetalakeMetaMapper;
-import org.apache.gravitino.storage.relational.mapper.ModelMetaMapper;
-import
org.apache.gravitino.storage.relational.mapper.ModelVersionAliasRelMapper;
-import org.apache.gravitino.storage.relational.mapper.ModelVersionMetaMapper;
-import org.apache.gravitino.storage.relational.mapper.OwnerMetaMapper;
-import org.apache.gravitino.storage.relational.mapper.RoleMetaMapper;
-import org.apache.gravitino.storage.relational.mapper.SchemaMetaMapper;
-import org.apache.gravitino.storage.relational.mapper.SecurableObjectMapper;
-import org.apache.gravitino.storage.relational.mapper.TableColumnMapper;
-import org.apache.gravitino.storage.relational.mapper.TableMetaMapper;
-import org.apache.gravitino.storage.relational.mapper.TagMetaMapper;
-import
org.apache.gravitino.storage.relational.mapper.TagMetadataObjectRelMapper;
-import org.apache.gravitino.storage.relational.mapper.TopicMetaMapper;
-import org.apache.gravitino.storage.relational.mapper.UserMetaMapper;
-import org.apache.gravitino.storage.relational.mapper.UserRoleRelMapper;
+import
org.apache.gravitino.storage.relational.mapper.provider.MapperPackageProvider;
import org.apache.ibatis.mapping.Environment;
import org.apache.ibatis.session.Configuration;
import org.apache.ibatis.session.SqlSessionFactory;
@@ -119,26 +101,10 @@ public class SqlSessionFactoryHelper {
// Initialize the configuration
Configuration configuration = new Configuration(environment);
configuration.setDatabaseId(jdbcType.name().toLowerCase());
- configuration.addMapper(MetalakeMetaMapper.class);
- configuration.addMapper(CatalogMetaMapper.class);
- configuration.addMapper(SchemaMetaMapper.class);
- configuration.addMapper(TableMetaMapper.class);
- configuration.addMapper(TableColumnMapper.class);
- configuration.addMapper(FilesetMetaMapper.class);
- configuration.addMapper(FilesetVersionMapper.class);
- configuration.addMapper(TopicMetaMapper.class);
- configuration.addMapper(UserMetaMapper.class);
- configuration.addMapper(RoleMetaMapper.class);
- configuration.addMapper(UserRoleRelMapper.class);
- configuration.addMapper(GroupMetaMapper.class);
- configuration.addMapper(GroupRoleRelMapper.class);
- configuration.addMapper(SecurableObjectMapper.class);
- configuration.addMapper(TagMetaMapper.class);
- configuration.addMapper(TagMetadataObjectRelMapper.class);
- configuration.addMapper(OwnerMetaMapper.class);
- configuration.addMapper(ModelMetaMapper.class);
- configuration.addMapper(ModelVersionMetaMapper.class);
- configuration.addMapper(ModelVersionAliasRelMapper.class);
+ ServiceLoader<MapperPackageProvider> loader =
ServiceLoader.load(MapperPackageProvider.class);
+ for (MapperPackageProvider provider : loader) {
+ configuration.addMappers(provider.getPackageName());
+ }
// Create the SqlSessionFactory object, it is a singleton object
if (sqlSessionFactory == null) {
diff --git
a/core/src/main/resources/META-INF/services/org.apache.gravitino.storage.relational.mapper.provider.MapperPackageProvider
b/core/src/main/resources/META-INF/services/org.apache.gravitino.storage.relational.mapper.provider.MapperPackageProvider
new file mode 100644
index 0000000000..1ec7ef05a3
--- /dev/null
+++
b/core/src/main/resources/META-INF/services/org.apache.gravitino.storage.relational.mapper.provider.MapperPackageProvider
@@ -0,0 +1,19 @@
+#
+# 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.
+#
+org.apache.gravitino.storage.relational.mapper.provider.DefaultMapperPackageProvider
\ No newline at end of file