Prechádzať zdrojové kódy

解决Sequence初始化多次问题(自定义情况下可不创建默认主键生成器).

nieqiurong 2 rokov pred
rodič
commit
ae541b2b16

+ 1 - 1
mybatis-plus-core/src/main/java/com/baomidou/mybatisplus/core/MybatisSqlSessionFactoryBuilder.java

@@ -84,7 +84,7 @@ public class MybatisSqlSessionFactoryBuilder extends SqlSessionFactoryBuilder {
 
 
         final IdentifierGenerator identifierGenerator;
         final IdentifierGenerator identifierGenerator;
         if (null == globalConfig.getIdentifierGenerator()) {
         if (null == globalConfig.getIdentifierGenerator()) {
-            identifierGenerator = new DefaultIdentifierGenerator();
+            identifierGenerator = DefaultIdentifierGenerator.getInstance();
             globalConfig.setIdentifierGenerator(identifierGenerator);
             globalConfig.setIdentifierGenerator(identifierGenerator);
         } else {
         } else {
             identifierGenerator = globalConfig.getIdentifierGenerator();
             identifierGenerator = globalConfig.getIdentifierGenerator();

+ 17 - 0
mybatis-plus-core/src/main/java/com/baomidou/mybatisplus/core/incrementer/DefaultIdentifierGenerator.java

@@ -27,8 +27,14 @@ import java.net.InetAddress;
  * @since 3.3.0
  * @since 3.3.0
  */
  */
 public class DefaultIdentifierGenerator implements IdentifierGenerator {
 public class DefaultIdentifierGenerator implements IdentifierGenerator {
+
     private final Sequence sequence;
     private final Sequence sequence;
 
 
+    /**
+     * @see #getInstance()
+     * @deprecated 3.5.3 共享默认单例
+     */
+    @Deprecated
     public DefaultIdentifierGenerator() {
     public DefaultIdentifierGenerator() {
         this.sequence = new Sequence(null);
         this.sequence = new Sequence(null);
     }
     }
@@ -49,4 +55,15 @@ public class DefaultIdentifierGenerator implements IdentifierGenerator {
     public Long nextId(Object entity) {
     public Long nextId(Object entity) {
         return sequence.nextId();
         return sequence.nextId();
     }
     }
+
+    public static DefaultIdentifierGenerator getInstance() {
+        return DefaultInstance.INSTANCE;
+    }
+
+    private static class DefaultInstance {
+
+        public static final DefaultIdentifierGenerator INSTANCE = new DefaultIdentifierGenerator();
+
+    }
+
 }
 }

+ 1 - 1
mybatis-plus-core/src/main/java/com/baomidou/mybatisplus/core/toolkit/IdWorker.java

@@ -35,7 +35,7 @@ public class IdWorker {
     /**
     /**
      * 主机和进程的机器码
      * 主机和进程的机器码
      */
      */
-    private static IdentifierGenerator IDENTIFIER_GENERATOR = new DefaultIdentifierGenerator();
+    private static IdentifierGenerator IDENTIFIER_GENERATOR = entity -> DefaultIdentifierGenerator.getInstance().nextId(entity);
 
 
     /**
     /**
      * 毫秒格式化时间
      * 毫秒格式化时间

+ 5 - 2
mybatis-plus-extension/src/main/java/com/baomidou/mybatisplus/extension/service/impl/ServiceImpl.java

@@ -21,6 +21,7 @@ import com.baomidou.mybatisplus.core.mapper.BaseMapper;
 import com.baomidou.mybatisplus.core.metadata.TableInfo;
 import com.baomidou.mybatisplus.core.metadata.TableInfo;
 import com.baomidou.mybatisplus.core.metadata.TableInfoHelper;
 import com.baomidou.mybatisplus.core.metadata.TableInfoHelper;
 import com.baomidou.mybatisplus.core.toolkit.*;
 import com.baomidou.mybatisplus.core.toolkit.*;
+import com.baomidou.mybatisplus.core.toolkit.reflect.GenericTypeUtils;
 import com.baomidou.mybatisplus.extension.service.IService;
 import com.baomidou.mybatisplus.extension.service.IService;
 import com.baomidou.mybatisplus.extension.toolkit.SqlHelper;
 import com.baomidou.mybatisplus.extension.toolkit.SqlHelper;
 import org.apache.ibatis.binding.MapperMethod;
 import org.apache.ibatis.binding.MapperMethod;
@@ -58,6 +59,8 @@ public class ServiceImpl<M extends BaseMapper<T>, T> implements IService<T> {
     @Autowired
     @Autowired
     protected SqlSessionFactory sqlSessionFactory;
     protected SqlSessionFactory sqlSessionFactory;
 
 
+    protected final Class<?>[] typeArguments = GenericTypeUtils.resolveTypeArguments(getClass(), ServiceImpl.class);
+
     @Override
     @Override
     public M getBaseMapper() {
     public M getBaseMapper() {
         return baseMapper;
         return baseMapper;
@@ -85,11 +88,11 @@ public class ServiceImpl<M extends BaseMapper<T>, T> implements IService<T> {
     }
     }
 
 
     protected Class<M> currentMapperClass() {
     protected Class<M> currentMapperClass() {
-        return (Class<M>) ReflectionKit.getSuperClassGenericType(this.getClass(), ServiceImpl.class, 0);
+        return (Class<M>) this.typeArguments[0];
     }
     }
 
 
     protected Class<T> currentModelClass() {
     protected Class<T> currentModelClass() {
-        return (Class<T>) ReflectionKit.getSuperClassGenericType(this.getClass(), ServiceImpl.class, 1);
+        return (Class<T>) this.typeArguments[1];
     }
     }