This is an automated email from the ASF dual-hosted git repository.

wuzhiguo pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/bigtop-manager.git


The following commit(s) were added to refs/heads/main by this push:
     new 4cce064  BIGTOP-4230: Add some methods for BaseDao (#74)
4cce064 is described below

commit 4cce0646a145f2a9e94e1a48b899d35d7a2b1119
Author: haopeng <[email protected]>
AuthorDate: Fri Sep 20 14:22:07 2024 +0800

    BIGTOP-4230: Add some methods for BaseDao (#74)
---
 .../dao/interceptor/AuditingInterceptor.java       |   4 +-
 .../bigtop/manager/dao/po/ChatMessagePO.java       |   6 +-
 .../apache/bigtop/manager/dao/po/ChatThreadPO.java |   6 +-
 .../org/apache/bigtop/manager/dao/po/HostPO.java   |   2 +-
 .../org/apache/bigtop/manager/dao/po/JobPO.java    |   4 +-
 .../manager/dao/po/PlatformAuthorizedPO.java       |   2 +-
 .../org/apache/bigtop/manager/dao/po/RepoPO.java   |   2 +-
 .../org/apache/bigtop/manager/dao/po/StackPO.java  |   4 +-
 .../org/apache/bigtop/manager/dao/po/StagePO.java  |   6 +-
 .../org/apache/bigtop/manager/dao/po/TaskPO.java   |   2 +-
 .../bigtop/manager/dao/repository/BaseDao.java     |  27 +-
 .../bigtop/manager/dao/repository/HostDao.java     |   2 -
 .../bigtop/manager/dao/repository/RepoDao.java     |   2 -
 .../bigtop/manager/dao/sql/BaseSqlProvider.java    |  53 +++-
 .../apache/bigtop/manager/dao/sql/SQLBuilder.java  | 322 ++++++++++++++++++++-
 .../src/main/resources/mapper/mysql/HostMapper.xml |   8 -
 .../src/main/resources/mapper/mysql/RepoMapper.xml |   8 -
 .../resources/mapper/postgresql/HostMapper.xml     |   8 -
 .../resources/mapper/postgresql/RepoMapper.xml     |   8 -
 .../manager/server/command/job/AbstractJob.java    |   6 +-
 .../server/command/job/ClusterCreateJob.java       |   8 +-
 .../server/command/stage/AbstractStage.java        |   6 +-
 .../manager/server/command/task/AbstractTask.java  |   6 +-
 .../server/command/task/ComponentInstallTask.java  |   2 +-
 .../server/command/task/ComponentStartTask.java    |   2 +-
 .../server/command/task/ComponentStopTask.java     |   2 +-
 .../server/scheduler/ComponentStatusScheduler.java |   4 +-
 .../server/scheduler/HostInfoScheduler.java        |   2 +-
 .../server/service/impl/ClusterServiceImpl.java    |   4 +-
 .../server/service/impl/ConfigServiceImpl.java     |   2 +-
 .../server/service/impl/HostServiceImpl.java       |   2 +-
 .../server/service/impl/JobServiceImpl.java        |   6 +-
 .../server/service/impl/UserServiceImpl.java       |   2 +-
 33 files changed, 442 insertions(+), 88 deletions(-)

diff --git 
a/bigtop-manager-dao/src/main/java/org/apache/bigtop/manager/dao/interceptor/AuditingInterceptor.java
 
b/bigtop-manager-dao/src/main/java/org/apache/bigtop/manager/dao/interceptor/AuditingInterceptor.java
index a178fe5..e552ef6 100644
--- 
a/bigtop-manager-dao/src/main/java/org/apache/bigtop/manager/dao/interceptor/AuditingInterceptor.java
+++ 
b/bigtop-manager-dao/src/main/java/org/apache/bigtop/manager/dao/interceptor/AuditingInterceptor.java
@@ -72,7 +72,9 @@ public class AuditingInterceptor implements Interceptor {
             Collection<Object> objects;
             if (parameter instanceof MapperMethod.ParamMap) {
                 MapperMethod.ParamMap<Object> paramMap = 
((MapperMethod.ParamMap<Object>) parameter);
-                if (paramMap.get("param1") instanceof Collection) {
+                if (!paramMap.containsKey("param1") && 
paramMap.containsKey("arg0")) {
+                    objects = ((Collection<Object>) paramMap.get("arg0"));
+                } else if (paramMap.get("param1") instanceof Collection) {
                     objects = ((Collection<Object>) paramMap.get("param1"));
                 } else {
                     objects = 
Collections.singletonList(paramMap.get("param1"));
diff --git 
a/bigtop-manager-dao/src/main/java/org/apache/bigtop/manager/dao/po/ChatMessagePO.java
 
b/bigtop-manager-dao/src/main/java/org/apache/bigtop/manager/dao/po/ChatMessagePO.java
index 4236810..75cf6f6 100644
--- 
a/bigtop-manager-dao/src/main/java/org/apache/bigtop/manager/dao/po/ChatMessagePO.java
+++ 
b/bigtop-manager-dao/src/main/java/org/apache/bigtop/manager/dao/po/ChatMessagePO.java
@@ -37,12 +37,12 @@ public class ChatMessagePO extends BasePO implements 
Serializable {
     @Column(name = "message", nullable = false, length = 255)
     private String message;
 
-    @Column(name = "sender")
+    @Column(name = "sender", nullable = false)
     private String sender;
 
-    @Column(name = "user_id")
+    @Column(name = "user_id", nullable = false)
     private Long userId;
 
-    @Column(name = "thread_id")
+    @Column(name = "thread_id", nullable = false)
     private Long threadId;
 }
diff --git 
a/bigtop-manager-dao/src/main/java/org/apache/bigtop/manager/dao/po/ChatThreadPO.java
 
b/bigtop-manager-dao/src/main/java/org/apache/bigtop/manager/dao/po/ChatThreadPO.java
index f17cfb3..cddbb22 100644
--- 
a/bigtop-manager-dao/src/main/java/org/apache/bigtop/manager/dao/po/ChatThreadPO.java
+++ 
b/bigtop-manager-dao/src/main/java/org/apache/bigtop/manager/dao/po/ChatThreadPO.java
@@ -38,12 +38,12 @@ public class ChatThreadPO extends BasePO implements 
Serializable {
     @Column(name = "model", nullable = false, length = 255)
     private String model;
 
-    @Column(name = "thread_info", columnDefinition = "json", nullable = false)
+    @Column(name = "thread_info", columnDefinition = "json")
     private Map<String, String> threadInfo;
 
-    @Column(name = "user_id")
+    @Column(name = "user_id", nullable = false)
     private Long userId;
 
-    @Column(name = "platform_id")
+    @Column(name = "platform_id", nullable = false)
     private Long platformId;
 }
diff --git 
a/bigtop-manager-dao/src/main/java/org/apache/bigtop/manager/dao/po/HostPO.java 
b/bigtop-manager-dao/src/main/java/org/apache/bigtop/manager/dao/po/HostPO.java
index f0b3054..5b41317 100644
--- 
a/bigtop-manager-dao/src/main/java/org/apache/bigtop/manager/dao/po/HostPO.java
+++ 
b/bigtop-manager-dao/src/main/java/org/apache/bigtop/manager/dao/po/HostPO.java
@@ -69,7 +69,7 @@ public class HostPO extends BasePO implements Serializable {
     @Column(name = "state")
     private String state;
 
-    @Column(name = "cluster_id")
+    @Column(name = "cluster_id", nullable = false)
     private Long clusterId;
 
     @Transient
diff --git 
a/bigtop-manager-dao/src/main/java/org/apache/bigtop/manager/dao/po/JobPO.java 
b/bigtop-manager-dao/src/main/java/org/apache/bigtop/manager/dao/po/JobPO.java
index 30adbb6..22938e2 100644
--- 
a/bigtop-manager-dao/src/main/java/org/apache/bigtop/manager/dao/po/JobPO.java
+++ 
b/bigtop-manager-dao/src/main/java/org/apache/bigtop/manager/dao/po/JobPO.java
@@ -39,14 +39,14 @@ public class JobPO extends BasePO implements Serializable {
     @Column(name = "id")
     private Long id;
 
-    @Column(name = "state")
+    @Column(name = "state", nullable = false)
     private String state;
 
     @Column(name = "name")
     private String name;
 
     @Lob
-    @Column(name = "context")
+    @Column(name = "context", nullable = false)
     private String context;
 
     @Column(name = "cluster_id")
diff --git 
a/bigtop-manager-dao/src/main/java/org/apache/bigtop/manager/dao/po/PlatformAuthorizedPO.java
 
b/bigtop-manager-dao/src/main/java/org/apache/bigtop/manager/dao/po/PlatformAuthorizedPO.java
index f27fcd4..214f3a9 100644
--- 
a/bigtop-manager-dao/src/main/java/org/apache/bigtop/manager/dao/po/PlatformAuthorizedPO.java
+++ 
b/bigtop-manager-dao/src/main/java/org/apache/bigtop/manager/dao/po/PlatformAuthorizedPO.java
@@ -39,6 +39,6 @@ public class PlatformAuthorizedPO extends BasePO implements 
Serializable {
     @Column(name = "credentials", columnDefinition = "json", nullable = false)
     private Map<String, String> credentials;
 
-    @Column(name = "platform_id")
+    @Column(name = "platform_id", nullable = false)
     private Long platformId;
 }
diff --git 
a/bigtop-manager-dao/src/main/java/org/apache/bigtop/manager/dao/po/RepoPO.java 
b/bigtop-manager-dao/src/main/java/org/apache/bigtop/manager/dao/po/RepoPO.java
index 00030d2..53e513c 100644
--- 
a/bigtop-manager-dao/src/main/java/org/apache/bigtop/manager/dao/po/RepoPO.java
+++ 
b/bigtop-manager-dao/src/main/java/org/apache/bigtop/manager/dao/po/RepoPO.java
@@ -53,6 +53,6 @@ public class RepoPO extends BasePO implements Serializable {
     @Column(name = "repo_type")
     private String repoType;
 
-    @Column(name = "cluster_id")
+    @Column(name = "cluster_id", nullable = false)
     private Long clusterId;
 }
diff --git 
a/bigtop-manager-dao/src/main/java/org/apache/bigtop/manager/dao/po/StackPO.java
 
b/bigtop-manager-dao/src/main/java/org/apache/bigtop/manager/dao/po/StackPO.java
index 76db3ea..5b7add2 100644
--- 
a/bigtop-manager-dao/src/main/java/org/apache/bigtop/manager/dao/po/StackPO.java
+++ 
b/bigtop-manager-dao/src/main/java/org/apache/bigtop/manager/dao/po/StackPO.java
@@ -35,9 +35,9 @@ public class StackPO extends BasePO implements Serializable {
     @Column(name = "id")
     private Long id;
 
-    @Column(name = "stack_name")
+    @Column(name = "stack_name", nullable = false)
     private String stackName;
 
-    @Column(name = "stack_version")
+    @Column(name = "stack_version", nullable = false)
     private String stackVersion;
 }
diff --git 
a/bigtop-manager-dao/src/main/java/org/apache/bigtop/manager/dao/po/StagePO.java
 
b/bigtop-manager-dao/src/main/java/org/apache/bigtop/manager/dao/po/StagePO.java
index 22a2d94..dd17195 100644
--- 
a/bigtop-manager-dao/src/main/java/org/apache/bigtop/manager/dao/po/StagePO.java
+++ 
b/bigtop-manager-dao/src/main/java/org/apache/bigtop/manager/dao/po/StagePO.java
@@ -37,10 +37,10 @@ public class StagePO extends BasePO implements Serializable 
{
     @Column(name = "id")
     private Long id;
 
-    @Column(name = "name")
+    @Column(name = "name", nullable = false)
     private String name;
 
-    @Column(name = "state")
+    @Column(name = "state", nullable = false)
     private String state;
 
     @Column(name = "order")
@@ -55,7 +55,7 @@ public class StagePO extends BasePO implements Serializable {
     @Column(name = "context")
     private String context;
 
-    @Column(name = "job_id")
+    @Column(name = "job_id", nullable = false)
     private Long jobId;
 
     @Column(name = "cluster_id")
diff --git 
a/bigtop-manager-dao/src/main/java/org/apache/bigtop/manager/dao/po/TaskPO.java 
b/bigtop-manager-dao/src/main/java/org/apache/bigtop/manager/dao/po/TaskPO.java
index 54b5071..7fad463 100644
--- 
a/bigtop-manager-dao/src/main/java/org/apache/bigtop/manager/dao/po/TaskPO.java
+++ 
b/bigtop-manager-dao/src/main/java/org/apache/bigtop/manager/dao/po/TaskPO.java
@@ -38,7 +38,7 @@ public class TaskPO extends BasePO implements Serializable {
     @Column(name = "name")
     private String name;
 
-    @Column(name = "context")
+    @Column(name = "context", nullable = false)
     private String context;
 
     @Column(name = "state")
diff --git 
a/bigtop-manager-dao/src/main/java/org/apache/bigtop/manager/dao/repository/BaseDao.java
 
b/bigtop-manager-dao/src/main/java/org/apache/bigtop/manager/dao/repository/BaseDao.java
index 2c85e6f..686ece1 100644
--- 
a/bigtop-manager-dao/src/main/java/org/apache/bigtop/manager/dao/repository/BaseDao.java
+++ 
b/bigtop-manager-dao/src/main/java/org/apache/bigtop/manager/dao/repository/BaseDao.java
@@ -42,11 +42,36 @@ public interface BaseDao<Entity> {
     int save(Entity entity);
 
     /**
-     * Update the entity by primary key.
+     * Insert all entities.
+     */
+    @Options(useGeneratedKeys = true, keyProperty = "id", keyColumn = "id")
+    @InsertProvider(type = BaseSqlProvider.class, method = "insertList")
+    int saveAll(List<Entity> entities);
+
+    /**
+     * Partially update the entity by primary key.
+     */
+    @UpdateProvider(type = BaseSqlProvider.class, method = "partialUpdateById")
+    int partialUpdateById(Entity entity);
+
+    /**
+     * Fully update the entity by primary key.
      */
     @UpdateProvider(type = BaseSqlProvider.class, method = "updateById")
     int updateById(Entity entity);
 
+    /**
+     * Partially update the entities by primary key.
+     */
+    @UpdateProvider(type = BaseSqlProvider.class, method = 
"partialUpdateByIds")
+    int partialUpdateByIds(List<Entity> entities);
+
+    /**
+     * Fully update the entities by primary key.
+     */
+    @UpdateProvider(type = BaseSqlProvider.class, method = "updateByIds")
+    int updateByIds(List<Entity> entities);
+
     /**
      * Query the entity by primary key.
      */
diff --git 
a/bigtop-manager-dao/src/main/java/org/apache/bigtop/manager/dao/repository/HostDao.java
 
b/bigtop-manager-dao/src/main/java/org/apache/bigtop/manager/dao/repository/HostDao.java
index 335a5e5..be95624 100644
--- 
a/bigtop-manager-dao/src/main/java/org/apache/bigtop/manager/dao/repository/HostDao.java
+++ 
b/bigtop-manager-dao/src/main/java/org/apache/bigtop/manager/dao/repository/HostDao.java
@@ -28,8 +28,6 @@ import java.util.List;
 
 public interface HostDao extends BaseDao<HostPO> {
 
-    int saveAll(@Param("hosts") List<HostPO> hosts);
-
     HostPO findByHostname(@Param("hostname") String hostname);
 
     List<HostPO> findAllByHostnameIn(@Param("hostnames") Collection<String> 
hostnames);
diff --git 
a/bigtop-manager-dao/src/main/java/org/apache/bigtop/manager/dao/repository/RepoDao.java
 
b/bigtop-manager-dao/src/main/java/org/apache/bigtop/manager/dao/repository/RepoDao.java
index c951dfb..3c8d302 100644
--- 
a/bigtop-manager-dao/src/main/java/org/apache/bigtop/manager/dao/repository/RepoDao.java
+++ 
b/bigtop-manager-dao/src/main/java/org/apache/bigtop/manager/dao/repository/RepoDao.java
@@ -30,7 +30,5 @@ public interface RepoDao extends BaseDao<RepoPO> {
 
     Optional<RepoPO> findByRepoName(@Param("repoName") String clusterName);
 
-    int saveAll(@Param("clusters") List<RepoPO> repos);
-
     List<RepoPO> findAllByClusterId(@Param("clusterId") Long clusterId);
 }
diff --git 
a/bigtop-manager-dao/src/main/java/org/apache/bigtop/manager/dao/sql/BaseSqlProvider.java
 
b/bigtop-manager-dao/src/main/java/org/apache/bigtop/manager/dao/sql/BaseSqlProvider.java
index 09eaf94..d2f9296 100644
--- 
a/bigtop-manager-dao/src/main/java/org/apache/bigtop/manager/dao/sql/BaseSqlProvider.java
+++ 
b/bigtop-manager-dao/src/main/java/org/apache/bigtop/manager/dao/sql/BaseSqlProvider.java
@@ -31,6 +31,7 @@ import lombok.extern.slf4j.Slf4j;
 import java.io.Serializable;
 import java.lang.reflect.Type;
 import java.util.Collection;
+import java.util.List;
 
 @Slf4j
 public class BaseSqlProvider {
@@ -46,6 +47,43 @@ public class BaseSqlProvider {
         return SQLBuilder.insert(tableMetaData, entity, databaseId);
     }
 
+    public <Entity> String insertList(List<Entity> entities, ProviderContext 
context) {
+        Assert.notNull(entities, "entities must not be null");
+        Assert.notEmpty(entities, "entities list must not be empty");
+
+        String databaseId = context.getDatabaseId();
+
+        Class<?> entityClass = entities.get(0).getClass();
+
+        TableMetaData tableMetaData = TableMetaData.forClass(entityClass);
+
+        return SQLBuilder.insertList(tableMetaData, entities, databaseId);
+    }
+
+    public <Entity> String partialUpdateById(Entity entity, ProviderContext 
context) {
+        Assert.notNull(entity, "entity must not null");
+
+        String databaseId = context.getDatabaseId();
+
+        Class<?> entityClass = entity.getClass();
+        TableMetaData tableMetaData = TableMetaData.forClass(entityClass);
+
+        return SQLBuilder.update(tableMetaData, entity, databaseId, true);
+    }
+
+    public <Entity> String partialUpdateByIds(List<Entity> entities, 
ProviderContext context) {
+        Assert.notNull(entities, "entities must not be null");
+        Assert.notEmpty(entities, "entities list must not be empty");
+
+        String databaseId = context.getDatabaseId();
+
+        Class<?> entityClass = entities.get(0).getClass();
+
+        TableMetaData tableMetaData = TableMetaData.forClass(entityClass);
+
+        return SQLBuilder.updateList(tableMetaData, entities, databaseId, 
true);
+    }
+
     public <Entity> String updateById(Entity entity, ProviderContext context) {
         Assert.notNull(entity, "entity must not null");
 
@@ -54,7 +92,20 @@ public class BaseSqlProvider {
         Class<?> entityClass = entity.getClass();
         TableMetaData tableMetaData = TableMetaData.forClass(entityClass);
 
-        return SQLBuilder.update(tableMetaData, entity, databaseId);
+        return SQLBuilder.update(tableMetaData, entity, databaseId, false);
+    }
+
+    public <Entity> String updateByIds(List<Entity> entities, ProviderContext 
context) {
+        Assert.notNull(entities, "entities must not be null");
+        Assert.notEmpty(entities, "entities list must not be empty");
+
+        String databaseId = context.getDatabaseId();
+
+        Class<?> entityClass = entities.get(0).getClass();
+
+        TableMetaData tableMetaData = TableMetaData.forClass(entityClass);
+
+        return SQLBuilder.updateList(tableMetaData, entities, databaseId, 
false);
     }
 
     public String selectById(Serializable id, ProviderContext context) {
diff --git 
a/bigtop-manager-dao/src/main/java/org/apache/bigtop/manager/dao/sql/SQLBuilder.java
 
b/bigtop-manager-dao/src/main/java/org/apache/bigtop/manager/dao/sql/SQLBuilder.java
index bf220d5..4321f22 100644
--- 
a/bigtop-manager-dao/src/main/java/org/apache/bigtop/manager/dao/sql/SQLBuilder.java
+++ 
b/bigtop-manager-dao/src/main/java/org/apache/bigtop/manager/dao/sql/SQLBuilder.java
@@ -20,7 +20,11 @@
 package org.apache.bigtop.manager.dao.sql;
 
 import org.apache.bigtop.manager.common.utils.ClassUtils;
+import org.apache.bigtop.manager.dao.annotations.CreateBy;
+import org.apache.bigtop.manager.dao.annotations.CreateTime;
 import org.apache.bigtop.manager.dao.annotations.QueryCondition;
+import org.apache.bigtop.manager.dao.annotations.UpdateBy;
+import org.apache.bigtop.manager.dao.annotations.UpdateTime;
 import org.apache.bigtop.manager.dao.enums.DBType;
 
 import org.apache.ibatis.jdbc.SQL;
@@ -31,10 +35,13 @@ import org.springframework.util.ReflectionUtils;
 
 import lombok.extern.slf4j.Slf4j;
 
+import jakarta.persistence.Column;
 import java.beans.PropertyDescriptor;
 import java.io.Serializable;
 import java.lang.reflect.Field;
+import java.util.ArrayList;
 import java.util.Collection;
+import java.util.LinkedHashMap;
 import java.util.List;
 import java.util.Map;
 import java.util.Objects;
@@ -97,7 +104,99 @@ public class SQLBuilder {
         return sql.toString();
     }
 
-    public static <Entity> String update(TableMetaData tableMetaData, Entity 
entity, String databaseId) {
+    public static <Entity> String insertList(TableMetaData tableMetaData, 
List<Entity> entities, String databaseId) {
+        if (entities == null || entities.isEmpty()) {
+            throw new IllegalArgumentException("Entities list must not be null 
or empty");
+        }
+
+        Class<?> entityClass = entities.get(0).getClass();
+        Map<String, String> fieldColumnMap = tableMetaData.getFieldColumnMap();
+
+        SQL sql = new SQL();
+        switch (DBType.toType(databaseId)) {
+            case MYSQL: {
+                sql.INSERT_INTO(keywordsFormat(tableMetaData.getTableName(), 
DBType.MYSQL));
+
+                boolean firstRow = true;
+                int idx = 0;
+                for (Entity entity : entities) {
+                    List<String> values = new ArrayList<>();
+                    for (Map.Entry<String, String> entry : 
fieldColumnMap.entrySet()) {
+                        // Ignore primary key
+                        if (Objects.equals(entry.getKey(), 
tableMetaData.getPkProperty())) {
+                            continue;
+                        }
+                        PropertyDescriptor ps = 
BeanUtils.getPropertyDescriptor(entityClass, entry.getKey());
+                        if (ps == null || ps.getReadMethod() == null) {
+                            continue;
+                        }
+                        Object value = 
ReflectionUtils.invokeMethod(ps.getReadMethod(), entity);
+                        if (!ObjectUtils.isEmpty(value)) {
+                            if (firstRow) {
+                                sql.VALUES(
+                                        keywordsFormat(entry.getValue(), 
DBType.MYSQL),
+                                        getTokenParam("arg0[" + idx + "]." + 
entry.getKey()));
+                            }
+                            values.add(getTokenParam("arg0[" + idx + "]." + 
entry.getKey()));
+                        }
+                    }
+                    if (firstRow) {
+                        firstRow = false;
+                    } else {
+                        sql.ADD_ROW();
+                        sql.INTO_VALUES(values.toArray(new String[0]));
+                    }
+                    idx++;
+                }
+                break;
+            }
+            case POSTGRESQL: {
+                sql.INSERT_INTO(keywordsFormat(tableMetaData.getTableName(), 
DBType.POSTGRESQL));
+
+                boolean firstRow = true;
+                List<String> columns = new ArrayList<>();
+                int idx = 0;
+                for (Entity entity : entities) {
+                    List<String> values = new ArrayList<>();
+                    for (Map.Entry<String, String> entry : 
fieldColumnMap.entrySet()) {
+                        // Ignore primary key
+                        if (Objects.equals(entry.getKey(), 
tableMetaData.getPkProperty())) {
+                            continue;
+                        }
+                        PropertyDescriptor ps = 
BeanUtils.getPropertyDescriptor(entityClass, entry.getKey());
+                        if (ps == null || ps.getReadMethod() == null) {
+                            continue;
+                        }
+                        Object value = 
ReflectionUtils.invokeMethod(ps.getReadMethod(), entity);
+                        if (!ObjectUtils.isEmpty(value)) {
+                            if (firstRow) {
+                                sql.VALUES(
+                                        keywordsFormat(entry.getValue(), 
DBType.POSTGRESQL),
+                                        getTokenParam("arg0[" + idx + "]." + 
entry.getKey()));
+                            }
+                            values.add(getTokenParam("arg0[" + idx + "]." + 
entry.getKey()));
+                        }
+                    }
+                    if (firstRow) {
+                        firstRow = false;
+                    } else {
+                        sql.ADD_ROW();
+                        sql.INTO_VALUES(values.toArray(new String[0]));
+                    }
+                    idx++;
+                }
+            }
+
+            default: {
+                log.error("Unsupported data source");
+            }
+        }
+
+        return sql.toString();
+    }
+
+    public static <Entity> String update(
+            TableMetaData tableMetaData, Entity entity, String databaseId, 
boolean partial) {
         Class<?> entityClass = entity.getClass();
         Map<String, String> fieldColumnMap = tableMetaData.getFieldColumnMap();
 
@@ -115,9 +214,17 @@ public class SQLBuilder {
                         continue;
                     }
                     Object value = 
ReflectionUtils.invokeMethod(ps.getReadMethod(), entity);
-                    if (!ObjectUtils.isEmpty(value)) {
-                        sql.SET(getEquals(keywordsFormat(entry.getValue(), 
DBType.MYSQL), entry.getKey()));
+                    if (ObjectUtils.isEmpty(value) && partial) {
+                        continue;
+                    }
+                    Field field = ReflectionUtils.findField(entityClass, 
entry.getKey());
+                    if (field != null) {
+                        Column column = field.getAnnotation(Column.class);
+                        if (column != null && !column.nullable() && value == 
null) {
+                            continue;
+                        }
                     }
+                    sql.SET(getEquals(keywordsFormat(entry.getValue(), 
DBType.MYSQL), entry.getKey()));
                 }
 
                 sql.WHERE(getEquals(
@@ -136,9 +243,17 @@ public class SQLBuilder {
                         continue;
                     }
                     Object value = 
ReflectionUtils.invokeMethod(ps.getReadMethod(), entity);
-                    if (!ObjectUtils.isEmpty(value)) {
-                        sql.SET(getEquals(keywordsFormat(entry.getValue(), 
DBType.POSTGRESQL), entry.getKey()));
+                    if (ObjectUtils.isEmpty(value) && partial) {
+                        continue;
                     }
+                    Field field = ReflectionUtils.findField(entityClass, 
entry.getKey());
+                    if (field != null) {
+                        Column column = field.getAnnotation(Column.class);
+                        if (column != null && !column.nullable() && value == 
null) {
+                            continue;
+                        }
+                    }
+                    sql.SET(getEquals(keywordsFormat(entry.getValue(), 
DBType.POSTGRESQL), entry.getKey()));
                 }
                 sql.WHERE(getEquals(
                         keywordsFormat(tableMetaData.getPkColumn(), 
DBType.POSTGRESQL), tableMetaData.getPkProperty()));
@@ -152,6 +267,189 @@ public class SQLBuilder {
         return sql.toString();
     }
 
+    public static <Entity> String updateList(
+            TableMetaData tableMetaData, List<Entity> entities, String 
databaseId, boolean partial) {
+        if (entities == null || entities.isEmpty()) {
+            throw new IllegalArgumentException("Entities list must not be null 
or empty");
+        }
+
+        Class<?> entityClass = entities.get(0).getClass();
+        Map<String, String> fieldColumnMap = tableMetaData.getFieldColumnMap();
+
+        StringBuilder sqlBuilder = new StringBuilder();
+        switch (DBType.toType(databaseId)) {
+            case MYSQL: {
+                sqlBuilder
+                        .append("UPDATE ")
+                        .append(keywordsFormat(tableMetaData.getTableName(), 
DBType.MYSQL))
+                        .append(" SET ");
+                Map<String, StringBuilder> setClauses = new LinkedHashMap<>();
+                String primaryKey = keywordsFormat("id", DBType.MYSQL);
+                for (Map.Entry<String, String> entry : 
fieldColumnMap.entrySet()) {
+                    // Ignore primary key
+                    if (Objects.equals(entry.getKey(), 
tableMetaData.getPkProperty())) {
+                        primaryKey = keywordsFormat(entry.getValue(), 
DBType.MYSQL);
+                        continue;
+                    }
+
+                    StringBuilder caseClause = new StringBuilder();
+                    caseClause
+                            .append(keywordsFormat(entry.getValue(), 
DBType.MYSQL))
+                            .append(" = CASE ");
+                    for (Entity entity : entities) {
+                        PropertyDescriptor ps = 
BeanUtils.getPropertyDescriptor(entityClass, entry.getKey());
+                        if (ps == null || ps.getReadMethod() == null) {
+                            continue;
+                        }
+                        Field field = ReflectionUtils.findField(entityClass, 
entry.getKey());
+                        if (field == null || checkBaseField(field)) {
+                            continue;
+                        }
+                        Object value = 
ReflectionUtils.invokeMethod(ps.getReadMethod(), entity);
+                        PropertyDescriptor pkPs =
+                                BeanUtils.getPropertyDescriptor(entityClass, 
tableMetaData.getPkProperty());
+                        if (pkPs == null || pkPs.getReadMethod() == null) {
+                            continue;
+                        }
+                        Object pkValue = 
ReflectionUtils.invokeMethod(pkPs.getReadMethod(), entity);
+
+                        if (!ObjectUtils.isEmpty(value)) {
+                            caseClause
+                                    .append("WHEN ")
+                                    .append(primaryKey)
+                                    .append(" = '")
+                                    .append(pkValue)
+                                    .append("' THEN '")
+                                    
.append(escapeSingleQuote(value.toString()))
+                                    .append("' ");
+                        } else if (!partial) {
+                            Column column = field.getAnnotation(Column.class);
+                            if (column != null && !column.nullable() && value 
== null) {
+                                continue;
+                            }
+                            caseClause
+                                    .append("WHEN ")
+                                    .append(primaryKey)
+                                    .append(" = '")
+                                    .append(pkValue)
+                                    .append("' THEN NULL ");
+                        }
+                    }
+                    caseClause
+                            .append("ELSE ")
+                            .append(keywordsFormat(entry.getValue(), 
DBType.MYSQL))
+                            .append(" ");
+                    caseClause.append("END");
+                    setClauses.put(entry.getValue(), caseClause);
+                }
+                sqlBuilder.append(String.join(", ", setClauses.values()));
+
+                sqlBuilder.append(" WHERE ").append(primaryKey).append(" IN 
(");
+                String pkValues = entities.stream()
+                        .map(entity -> {
+                            PropertyDescriptor pkPs =
+                                    
BeanUtils.getPropertyDescriptor(entityClass, tableMetaData.getPkProperty());
+                            Object pkValue = 
ReflectionUtils.invokeMethod(pkPs.getReadMethod(), entity);
+                            return "'" + pkValue.toString() + "'";
+                        })
+                        .collect(Collectors.joining(", "));
+
+                sqlBuilder.append(pkValues).append(")");
+                break;
+            }
+            case POSTGRESQL: {
+                sqlBuilder
+                        .append("UPDATE ")
+                        .append("\"")
+                        .append(tableMetaData.getTableName())
+                        .append("\"")
+                        .append(" SET ");
+                Map<String, StringBuilder> setClauses = new LinkedHashMap<>();
+                String primaryKey = keywordsFormat("id", DBType.POSTGRESQL);
+                for (Map.Entry<String, String> entry : 
fieldColumnMap.entrySet()) {
+                    // Ignore primary key
+                    if (Objects.equals(entry.getKey(), 
tableMetaData.getPkProperty())) {
+                        primaryKey = keywordsFormat(entry.getValue(), 
DBType.POSTGRESQL);
+                        continue;
+                    }
+                    Field field = ReflectionUtils.findField(entityClass, 
entry.getKey());
+                    if (field == null || checkBaseField(field)) {
+                        continue;
+                    }
+                    StringBuilder caseClause = new StringBuilder();
+                    caseClause
+                            .append(keywordsFormat(entry.getValue(), 
DBType.POSTGRESQL))
+                            .append(" = CASE ");
+
+                    for (Entity entity : entities) {
+                        PropertyDescriptor ps = 
BeanUtils.getPropertyDescriptor(entityClass, entry.getKey());
+                        if (ps == null || ps.getReadMethod() == null) {
+                            continue;
+                        }
+                        Object value = 
ReflectionUtils.invokeMethod(ps.getReadMethod(), entity);
+                        PropertyDescriptor pkPs =
+                                BeanUtils.getPropertyDescriptor(entityClass, 
tableMetaData.getPkProperty());
+                        if (pkPs == null || pkPs.getReadMethod() == null) {
+                            continue;
+                        }
+                        Object pkValue = 
ReflectionUtils.invokeMethod(pkPs.getReadMethod(), entity);
+
+                        if (!ObjectUtils.isEmpty(value)) {
+                            caseClause
+                                    .append("WHEN ")
+                                    .append(primaryKey)
+                                    .append(" = '")
+                                    .append(pkValue)
+                                    .append("' THEN '")
+                                    
.append(escapeSingleQuote(value.toString()))
+                                    .append("' ");
+                        } else if (!partial) {
+                            Column column = field.getAnnotation(Column.class);
+                            if (column != null && !column.nullable() && value 
== null) {
+                                continue;
+                            }
+                            caseClause
+                                    .append("WHEN ")
+                                    .append(primaryKey)
+                                    .append(" = '")
+                                    .append(pkValue)
+                                    .append("' THEN NULL ");
+                        }
+                    }
+                    if (caseClause.toString().endsWith("CASE ")) {
+                        caseClause.append("WHEN TRUE THEN ");
+                    } else {
+                        caseClause.append("ELSE ");
+                    }
+                    caseClause
+                            .append(keywordsFormat(entry.getValue(), 
DBType.POSTGRESQL))
+                            .append(" ");
+                    caseClause.append("END");
+                    setClauses.put(entry.getValue(), caseClause);
+                }
+                sqlBuilder.append(String.join(", ", setClauses.values()));
+
+                sqlBuilder.append(" WHERE ").append(primaryKey).append(" IN 
(");
+                String pkValues = entities.stream()
+                        .map(entity -> {
+                            PropertyDescriptor pkPs =
+                                    
BeanUtils.getPropertyDescriptor(entityClass, tableMetaData.getPkProperty());
+                            Object pkValue = 
ReflectionUtils.invokeMethod(pkPs.getReadMethod(), entity);
+                            return "'" + pkValue.toString() + "'";
+                        })
+                        .collect(Collectors.joining(", "));
+
+                sqlBuilder.append(pkValues).append(")");
+                break;
+            }
+            default: {
+                log.error("Unsupported data source");
+            }
+        }
+
+        return sqlBuilder.toString();
+    }
+
     public static String selectById(TableMetaData tableMetaData, String 
databaseId, Serializable id) {
 
         SQL sql = new SQL();
@@ -336,6 +634,20 @@ public class SQLBuilder {
         return "#{" + property + "}";
     }
 
+    private static String escapeSingleQuote(String input) {
+        if (input != null) {
+            return input.replace("'", "''");
+        }
+        return null;
+    }
+
+    private static boolean checkBaseField(Field field) {
+        return field.isAnnotationPresent(CreateBy.class)
+                || field.isAnnotationPresent(CreateTime.class)
+                || field.isAnnotationPresent(UpdateBy.class)
+                || field.isAnnotationPresent(UpdateTime.class);
+    }
+
     private static <Condition> SQL mysqlCondition(Condition condition, 
TableMetaData tableMetaData)
             throws IllegalAccessException {
 
diff --git a/bigtop-manager-dao/src/main/resources/mapper/mysql/HostMapper.xml 
b/bigtop-manager-dao/src/main/resources/mapper/mysql/HostMapper.xml
index 4c475a7..ea168af 100644
--- a/bigtop-manager-dao/src/main/resources/mapper/mysql/HostMapper.xml
+++ b/bigtop-manager-dao/src/main/resources/mapper/mysql/HostMapper.xml
@@ -100,12 +100,4 @@
         </where>
     </select>
 
-    <insert id="saveAll" useGeneratedKeys="true" keyProperty="id" 
keyColumn="id">
-        insert into host (hostname, ipv4, ipv6, os, arch, 
available_processors, free_memory_size, total_memory_size, free_disk, 
total_disk, state, cluster_id, create_by, update_by, create_time, update_time)
-        values
-        <foreach collection='hosts' item='host' separator=','>
-            (#{host.hostname}, #{host.ipv4}, #{host.ipv6}, #{host.os}, 
#{host.arch}, #{host.availableProcessors}, #{host.freeMemorySize}, 
#{host.totalMemorySize}, #{host.freeDisk}, #{host.totalDisk}, #{host.state}, 
#{host.clusterId} 
,#{host.createBy},#{host.updateBy},#{host.createTime},#{host.updateTime})
-        </foreach>
-    </insert>
-
 </mapper>
\ No newline at end of file
diff --git a/bigtop-manager-dao/src/main/resources/mapper/mysql/RepoMapper.xml 
b/bigtop-manager-dao/src/main/resources/mapper/mysql/RepoMapper.xml
index cee5e86..d1f0d35 100644
--- a/bigtop-manager-dao/src/main/resources/mapper/mysql/RepoMapper.xml
+++ b/bigtop-manager-dao/src/main/resources/mapper/mysql/RepoMapper.xml
@@ -40,14 +40,6 @@
         limit 1
     </select>
 
-    <insert id="saveAll" useGeneratedKeys="true" keyProperty="id" 
keyColumn="id">
-        insert into repo (base_url, os, arch, repo_id, repo_name, repo_type, 
cluster_id, create_by, update_by, create_time, update_time)
-        values
-        <foreach collection='clusters' item='cluster' separator=','>
-            
(#{cluster.baseUrl},#{cluster.os},#{cluster.arch},#{cluster.repoId},#{cluster.repoName},#{cluster.repoType},#{cluster.clusterId},#{cluster.createBy},#{cluster.updateBy},#{cluster.createTime},#{cluster.updateTime})
-        </foreach>
-    </insert>
-
     <select id="findAllByClusterId" parameterType="java.lang.Long"
             resultType="org.apache.bigtop.manager.dao.po.RepoPO">
         select
diff --git 
a/bigtop-manager-dao/src/main/resources/mapper/postgresql/HostMapper.xml 
b/bigtop-manager-dao/src/main/resources/mapper/postgresql/HostMapper.xml
index 4c475a7..ea168af 100644
--- a/bigtop-manager-dao/src/main/resources/mapper/postgresql/HostMapper.xml
+++ b/bigtop-manager-dao/src/main/resources/mapper/postgresql/HostMapper.xml
@@ -100,12 +100,4 @@
         </where>
     </select>
 
-    <insert id="saveAll" useGeneratedKeys="true" keyProperty="id" 
keyColumn="id">
-        insert into host (hostname, ipv4, ipv6, os, arch, 
available_processors, free_memory_size, total_memory_size, free_disk, 
total_disk, state, cluster_id, create_by, update_by, create_time, update_time)
-        values
-        <foreach collection='hosts' item='host' separator=','>
-            (#{host.hostname}, #{host.ipv4}, #{host.ipv6}, #{host.os}, 
#{host.arch}, #{host.availableProcessors}, #{host.freeMemorySize}, 
#{host.totalMemorySize}, #{host.freeDisk}, #{host.totalDisk}, #{host.state}, 
#{host.clusterId} 
,#{host.createBy},#{host.updateBy},#{host.createTime},#{host.updateTime})
-        </foreach>
-    </insert>
-
 </mapper>
\ No newline at end of file
diff --git 
a/bigtop-manager-dao/src/main/resources/mapper/postgresql/RepoMapper.xml 
b/bigtop-manager-dao/src/main/resources/mapper/postgresql/RepoMapper.xml
index cee5e86..d1f0d35 100644
--- a/bigtop-manager-dao/src/main/resources/mapper/postgresql/RepoMapper.xml
+++ b/bigtop-manager-dao/src/main/resources/mapper/postgresql/RepoMapper.xml
@@ -40,14 +40,6 @@
         limit 1
     </select>
 
-    <insert id="saveAll" useGeneratedKeys="true" keyProperty="id" 
keyColumn="id">
-        insert into repo (base_url, os, arch, repo_id, repo_name, repo_type, 
cluster_id, create_by, update_by, create_time, update_time)
-        values
-        <foreach collection='clusters' item='cluster' separator=','>
-            
(#{cluster.baseUrl},#{cluster.os},#{cluster.arch},#{cluster.repoId},#{cluster.repoName},#{cluster.repoType},#{cluster.clusterId},#{cluster.createBy},#{cluster.updateBy},#{cluster.createTime},#{cluster.updateTime})
-        </foreach>
-    </insert>
-
     <select id="findAllByClusterId" parameterType="java.lang.Long"
             resultType="org.apache.bigtop.manager.dao.po.RepoPO">
         select
diff --git 
a/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/command/job/AbstractJob.java
 
b/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/command/job/AbstractJob.java
index 42f1248..6ae1ee8 100644
--- 
a/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/command/job/AbstractJob.java
+++ 
b/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/command/job/AbstractJob.java
@@ -88,7 +88,7 @@ public abstract class AbstractJob implements Job {
     @Override
     public void beforeRun() {
         jobPO.setState(JobState.PROCESSING.getName());
-        jobDao.updateById(jobPO);
+        jobDao.partialUpdateById(jobPO);
     }
 
     @Override
@@ -124,7 +124,7 @@ public abstract class AbstractJob implements Job {
     public void onSuccess() {
         JobPO jobPO = getJobPO();
         jobPO.setState(JobState.SUCCESSFUL.getName());
-        jobDao.updateById(jobPO);
+        jobDao.partialUpdateById(jobPO);
     }
 
     @Override
@@ -154,7 +154,7 @@ public abstract class AbstractJob implements Job {
         if (!stagePOList.isEmpty()) {
             stageDao.updateStateByIds(stagePOList);
         }
-        jobDao.updateById(jobPO);
+        jobDao.partialUpdateById(jobPO);
     }
 
     @Override
diff --git 
a/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/command/job/ClusterCreateJob.java
 
b/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/command/job/ClusterCreateJob.java
index 47a2744..91a4c60 100644
--- 
a/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/command/job/ClusterCreateJob.java
+++ 
b/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/command/job/ClusterCreateJob.java
@@ -77,22 +77,22 @@ public class ClusterCreateJob extends AbstractJob {
 
         // Update cluster state to installed
         clusterPO.setState(MaintainState.INSTALLED.getName());
-        clusterDao.updateById(clusterPO);
+        clusterDao.partialUpdateById(clusterPO);
 
         // Link job to cluster after cluster successfully added
         JobPO jobPO = getJobPO();
         jobPO.setClusterId(clusterPO.getId());
-        jobDao.updateById(jobPO);
+        jobDao.partialUpdateById(jobPO);
 
         for (Stage stage : getStages()) {
             StagePO stagePO = stage.getStagePO();
             stagePO.setClusterId(clusterPO.getId());
-            stageDao.updateById(stagePO);
+            stageDao.partialUpdateById(stagePO);
 
             for (Task task : stage.getTasks()) {
                 TaskPO taskPO = task.getTaskPO();
                 taskPO.setClusterId(clusterPO.getId());
-                taskDao.updateById(taskPO);
+                taskDao.partialUpdateById(taskPO);
             }
         }
     }
diff --git 
a/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/command/stage/AbstractStage.java
 
b/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/command/stage/AbstractStage.java
index f0a7567..07259a3 100644
--- 
a/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/command/stage/AbstractStage.java
+++ 
b/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/command/stage/AbstractStage.java
@@ -76,7 +76,7 @@ public abstract class AbstractStage implements Stage {
     @Override
     public void beforeRun() {
         stagePO.setState(JobState.PROCESSING.getName());
-        stageDao.updateById(stagePO);
+        stageDao.partialUpdateById(stagePO);
     }
 
     @Override
@@ -121,14 +121,14 @@ public abstract class AbstractStage implements Stage {
     public void onSuccess() {
         StagePO stagePO = getStagePO();
         stagePO.setState(JobState.SUCCESSFUL.getName());
-        stageDao.updateById(stagePO);
+        stageDao.partialUpdateById(stagePO);
     }
 
     @Override
     public void onFailure() {
         StagePO stagePO = getStagePO();
         stagePO.setState(JobState.FAILED.getName());
-        stageDao.updateById(stagePO);
+        stageDao.partialUpdateById(stagePO);
     }
 
     @Override
diff --git 
a/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/command/task/AbstractTask.java
 
b/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/command/task/AbstractTask.java
index 41f840c..e8767cb 100644
--- 
a/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/command/task/AbstractTask.java
+++ 
b/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/command/task/AbstractTask.java
@@ -68,7 +68,7 @@ public abstract class AbstractTask implements Task {
     @Override
     public void beforeRun() {
         taskPO.setState(JobState.PROCESSING.getName());
-        taskDao.updateById(taskPO);
+        taskDao.partialUpdateById(taskPO);
     }
 
     @Override
@@ -106,7 +106,7 @@ public abstract class AbstractTask implements Task {
         TaskPO taskPO = getTaskPO();
         taskPO.setContent(ProtobufUtil.toJson(commandRequest));
         taskPO.setState(JobState.SUCCESSFUL.getName());
-        taskDao.updateById(taskPO);
+        taskDao.partialUpdateById(taskPO);
     }
 
     @Override
@@ -114,7 +114,7 @@ public abstract class AbstractTask implements Task {
         TaskPO taskPO = getTaskPO();
         taskPO.setContent(ProtobufUtil.toJson(commandRequest));
         taskPO.setState(JobState.FAILED.getName());
-        taskDao.updateById(taskPO);
+        taskDao.partialUpdateById(taskPO);
     }
 
     @Override
diff --git 
a/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/command/task/ComponentInstallTask.java
 
b/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/command/task/ComponentInstallTask.java
index 91f003c..176a8e7 100644
--- 
a/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/command/task/ComponentInstallTask.java
+++ 
b/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/command/task/ComponentInstallTask.java
@@ -43,7 +43,7 @@ public class ComponentInstallTask extends 
AbstractComponentTask {
         HostComponentPO hostComponentPO =
                 
hostComponentDao.findByClusterIdAndComponentNameAndHostname(clusterId, 
componentName, hostname);
         hostComponentPO.setState(MaintainState.INSTALLED.getName());
-        hostComponentDao.updateById(hostComponentPO);
+        hostComponentDao.partialUpdateById(hostComponentPO);
     }
 
     @Override
diff --git 
a/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/command/task/ComponentStartTask.java
 
b/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/command/task/ComponentStartTask.java
index fca02aa..aed3898 100644
--- 
a/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/command/task/ComponentStartTask.java
+++ 
b/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/command/task/ComponentStartTask.java
@@ -43,7 +43,7 @@ public class ComponentStartTask extends AbstractComponentTask 
{
         HostComponentPO hostComponentPO =
                 
hostComponentDao.findByClusterIdAndComponentNameAndHostname(clusterId, 
componentName, hostname);
         hostComponentPO.setState(MaintainState.STARTED.getName());
-        hostComponentDao.updateById(hostComponentPO);
+        hostComponentDao.partialUpdateById(hostComponentPO);
     }
 
     @Override
diff --git 
a/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/command/task/ComponentStopTask.java
 
b/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/command/task/ComponentStopTask.java
index b779aa4..2b7ea99 100644
--- 
a/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/command/task/ComponentStopTask.java
+++ 
b/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/command/task/ComponentStopTask.java
@@ -43,7 +43,7 @@ public class ComponentStopTask extends AbstractComponentTask {
         HostComponentPO hostComponentPO =
                 
hostComponentDao.findByClusterIdAndComponentNameAndHostname(clusterId, 
componentName, hostname);
         hostComponentPO.setState(MaintainState.STOPPED.getName());
-        hostComponentDao.updateById(hostComponentPO);
+        hostComponentDao.partialUpdateById(hostComponentPO);
     }
 
     @Override
diff --git 
a/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/scheduler/ComponentStatusScheduler.java
 
b/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/scheduler/ComponentStatusScheduler.java
index 4c0d99c..141362c 100644
--- 
a/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/scheduler/ComponentStatusScheduler.java
+++ 
b/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/scheduler/ComponentStatusScheduler.java
@@ -71,13 +71,13 @@ public class ComponentStatusScheduler {
             if (reply.getStatus() == 0
                     && MaintainState.fromString(hostComponentPO.getState()) == 
MaintainState.STOPPED) {
                 hostComponentPO.setState(MaintainState.STARTED.getName());
-                hostComponentDao.updateById(hostComponentPO);
+                hostComponentDao.partialUpdateById(hostComponentPO);
             }
 
             if (reply.getStatus() != 0
                     && MaintainState.fromString(hostComponentPO.getState()) == 
MaintainState.STARTED) {
                 hostComponentPO.setState(MaintainState.STOPPED.getName());
-                hostComponentDao.updateById(hostComponentPO);
+                hostComponentDao.partialUpdateById(hostComponentPO);
             }
         }
     }
diff --git 
a/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/scheduler/HostInfoScheduler.java
 
b/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/scheduler/HostInfoScheduler.java
index f314661..33ebab0 100644
--- 
a/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/scheduler/HostInfoScheduler.java
+++ 
b/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/scheduler/HostInfoScheduler.java
@@ -75,6 +75,6 @@ public class HostInfoScheduler {
             hostPO.setState(MaintainState.STOPPED.getName());
         }
 
-        hostDao.updateById(hostPO);
+        hostDao.partialUpdateById(hostPO);
     }
 }
diff --git 
a/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/service/impl/ClusterServiceImpl.java
 
b/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/service/impl/ClusterServiceImpl.java
index 19604a1..d412236 100644
--- 
a/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/service/impl/ClusterServiceImpl.java
+++ 
b/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/service/impl/ClusterServiceImpl.java
@@ -87,7 +87,7 @@ public class ClusterServiceImpl implements ClusterService {
                 
clusterDao.findByClusterName(clusterDTO.getClusterName()).orElse(new 
ClusterPO());
         if (oldClusterPO.getId() != null) {
             clusterPO.setId(oldClusterPO.getId());
-            clusterDao.updateById(clusterPO);
+            clusterDao.partialUpdateById(clusterPO);
         } else {
             clusterDao.save(clusterPO);
         }
@@ -126,7 +126,7 @@ public class ClusterServiceImpl implements ClusterService {
     public ClusterVO update(Long id, ClusterDTO clusterDTO) {
         ClusterPO clusterPO = ClusterConverter.INSTANCE.fromDTO2PO(clusterDTO);
         clusterPO.setId(id);
-        clusterDao.updateById(clusterPO);
+        clusterDao.partialUpdateById(clusterPO);
 
         return ClusterConverter.INSTANCE.fromEntity2VO(clusterPO);
     }
diff --git 
a/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/service/impl/ConfigServiceImpl.java
 
b/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/service/impl/ConfigServiceImpl.java
index 1f5ac9f..1db6526 100644
--- 
a/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/service/impl/ConfigServiceImpl.java
+++ 
b/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/service/impl/ConfigServiceImpl.java
@@ -94,7 +94,7 @@ public class ConfigServiceImpl implements ConfigService {
         if (shouldUpdateConfig(existConfigs, configs)) {
             // Unselect current config
             currentConfig.setSelected(false);
-            serviceConfigDao.updateById(currentConfig);
+            serviceConfigDao.partialUpdateById(currentConfig);
 
             // Create a new config
             String configDesc = "Update config for " + 
servicePO.getServiceName();
diff --git 
a/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/service/impl/HostServiceImpl.java
 
b/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/service/impl/HostServiceImpl.java
index 7127d0e..8bc79a3 100644
--- 
a/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/service/impl/HostServiceImpl.java
+++ 
b/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/service/impl/HostServiceImpl.java
@@ -99,7 +99,7 @@ public class HostServiceImpl implements HostService {
     public HostVO update(Long id, HostDTO hostDTO) {
         HostPO hostPO = HostConverter.INSTANCE.fromDTO2PO(hostDTO);
         hostPO.setId(id);
-        hostDao.updateById(hostPO);
+        hostDao.partialUpdateById(hostPO);
 
         return HostConverter.INSTANCE.fromPO2VO(hostPO);
     }
diff --git 
a/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/service/impl/JobServiceImpl.java
 
b/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/service/impl/JobServiceImpl.java
index b6a30a3..fbf0bbe 100644
--- 
a/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/service/impl/JobServiceImpl.java
+++ 
b/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/service/impl/JobServiceImpl.java
@@ -110,15 +110,15 @@ public class JobServiceImpl implements JobService {
         for (StagePO stagePO : jobPO.getStages()) {
             for (TaskPO taskPO : stagePO.getTasks()) {
                 taskPO.setState(JobState.PENDING.getName());
-                taskDao.updateById(taskPO);
+                taskDao.partialUpdateById(taskPO);
             }
 
             stagePO.setState(JobState.PENDING.getName());
-            stageDao.updateById(stagePO);
+            stageDao.partialUpdateById(stagePO);
         }
 
         jobPO.setState(JobState.PENDING.getName());
-        jobDao.updateById(jobPO);
+        jobDao.partialUpdateById(jobPO);
     }
 
     private Job recreateJob(JobPO jobPO) {
diff --git 
a/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/service/impl/UserServiceImpl.java
 
b/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/service/impl/UserServiceImpl.java
index eaa01d2..61568d1 100644
--- 
a/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/service/impl/UserServiceImpl.java
+++ 
b/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/service/impl/UserServiceImpl.java
@@ -50,7 +50,7 @@ public class UserServiceImpl implements UserService {
         Long id = SessionUserHolder.getUserId();
         UserPO userPO = userDao.findOptionalById(id).orElseThrow(() -> new 
ApiException(ApiExceptionEnum.NEED_LOGIN));
         userPO.setNickname(userDTO.getNickname());
-        userDao.updateById(userPO);
+        userDao.partialUpdateById(userPO);
         return UserConverter.INSTANCE.fromPO2VO(userPO);
     }
 }

Reply via email to