修改ID生成策略,自行指定,若未指定,则通过UUID生成
新增delete(String id) 方法
修正DomainUtils问题,当实体合并时,导致数据库内查询到的实体被覆盖,导致后续无法正常读取数据库中的值
diff --git a/samples/common/src/main/java/com/supwisdom/leaveschool/common/controller/api/CrudApiController.java b/samples/common/src/main/java/com/supwisdom/leaveschool/common/controller/api/CrudApiController.java
index 0f32960..e5e9e32 100644
--- a/samples/common/src/main/java/com/supwisdom/leaveschool/common/controller/api/CrudApiController.java
+++ b/samples/common/src/main/java/com/supwisdom/leaveschool/common/controller/api/CrudApiController.java
@@ -259,10 +259,10 @@
       throw new RuntimeException("exception.update.domain.not.exist");  // FIXME: RestException
     }
     
-    tmp = DomainUtils.merge(d, tmp);
+    d = DomainUtils.merge(d, tmp);
     
     @SuppressWarnings("unused")
-    D ret = getRepository().update(tmp);
+    D ret = getRepository().update(d);
     getRepository().flush();
     
     SuccessResponseModel res = new SuccessResponseModel();
@@ -319,7 +319,7 @@
       throw new RuntimeException("exception.delete.domain.not.exist");  // FIXME: RestException
     }
     
-    getRepository().delete(tmp);
+    getRepository().delete(id);
     
     SuccessResponseModel res = new SuccessResponseModel();
     res.setSuccess("info.delete.success");
diff --git a/samples/common/src/main/java/com/supwisdom/leaveschool/common/domain/ABaseDomain.java b/samples/common/src/main/java/com/supwisdom/leaveschool/common/domain/ABaseDomain.java
index 97707d5..2e44e7f 100644
--- a/samples/common/src/main/java/com/supwisdom/leaveschool/common/domain/ABaseDomain.java
+++ b/samples/common/src/main/java/com/supwisdom/leaveschool/common/domain/ABaseDomain.java
@@ -19,8 +19,8 @@
   private static final long serialVersionUID = 8023881887762314483L;
 
   @Id
-  @GeneratedValue(generator = "uuidStrategy")
-  @GenericGenerator(name = "uuidStrategy", strategy = "uuid")
+  //@GeneratedValue(generator = "uuidStrategy")
+  //@GenericGenerator(name = "uuidStrategy", strategy = "uuid")
   //@ApiModelProperty(value = "ID", required = false, example = "")
   @Column(name = "ID")
   private String id;
diff --git a/samples/common/src/main/java/com/supwisdom/leaveschool/common/repository/ABaseJpaRepositoryImpl.java b/samples/common/src/main/java/com/supwisdom/leaveschool/common/repository/ABaseJpaRepositoryImpl.java
index a245196..8e8b2cd 100644
--- a/samples/common/src/main/java/com/supwisdom/leaveschool/common/repository/ABaseJpaRepositoryImpl.java
+++ b/samples/common/src/main/java/com/supwisdom/leaveschool/common/repository/ABaseJpaRepositoryImpl.java
@@ -46,7 +46,9 @@
     try {
       Optional<T> entity = this.findById(id);
 
-      return entity.get();
+      if (entity.isPresent()) {
+        return entity.get();
+      }
     } catch (RuntimeException e) {
       System.out.println("RuntimeException:" + e.getMessage());
     } catch (Exception e) {
diff --git a/samples/common/src/main/java/com/supwisdom/leaveschool/common/repository/BaseJpaRepository.java b/samples/common/src/main/java/com/supwisdom/leaveschool/common/repository/BaseJpaRepository.java
index e1e0531..dabffdb 100644
--- a/samples/common/src/main/java/com/supwisdom/leaveschool/common/repository/BaseJpaRepository.java
+++ b/samples/common/src/main/java/com/supwisdom/leaveschool/common/repository/BaseJpaRepository.java
@@ -10,10 +10,21 @@
 import org.springframework.data.repository.NoRepositoryBean;
 
 import com.supwisdom.leaveschool.common.domain.ABaseDomain;
+import com.supwisdom.leaveschool.common.util.UUIDUtils;
 
 @NoRepositoryBean
 public interface BaseJpaRepository<T extends ABaseDomain> extends JpaRepository<T, String> {
   
+
+  /**
+   * 生成主键值。 默认使用方法
+   * 如果需要生成主键,需要由子类重写此方法根据需要的方式生成主键值。 
+   * @param entity 要持久化的对象 
+   */
+  public default String generateId() {
+    return UUIDUtils.create();
+  }
+
   public default Page<T> selectPageList(int pageIndex, int pageSize, Map<String, Object> mapBean) {
 
     PageRequest pageRequest = PageRequest.of(pageIndex, pageSize);
@@ -28,7 +39,9 @@
     try {
       Optional<T> entity = this.findById(id);
 
-      return entity.get();
+      if (entity.isPresent()) {
+        return entity.get();
+      }
     } catch (RuntimeException e) {
       System.out.println("RuntimeException:" + e.getMessage());
     } catch (Exception e) {
@@ -39,6 +52,10 @@
   }
   
   public default T insert(T entity) {
+    
+    if (entity.getId() == null || entity.getId().isEmpty()) {
+      entity.setId(generateId());
+    }
 
     if (entity.getCompanyId() == null || entity.getCompanyId().isEmpty()) {
       entity.setCompanyId("1");
@@ -62,5 +79,11 @@
 
     return e;
   }
+  
+  
+  public default void delete(String id) {
+    
+    this.deleteById(id);
+  }
 
 }
diff --git a/samples/common/src/main/java/com/supwisdom/leaveschool/common/util/DomainUtils.java b/samples/common/src/main/java/com/supwisdom/leaveschool/common/util/DomainUtils.java
index f02d7e5..37e1928 100644
--- a/samples/common/src/main/java/com/supwisdom/leaveschool/common/util/DomainUtils.java
+++ b/samples/common/src/main/java/com/supwisdom/leaveschool/common/util/DomainUtils.java
@@ -15,14 +15,14 @@
 public class DomainUtils {
 
   /**
-   * 合并 domain 中带有{@link Column}注解的字段值, 将 oldDomain 中的值,使用 newDomain 中不为null的值
+   * 合并 domain 中带有{@link Column}注解的字段值, 将 newDomain 中值为null的字段,使用 oldDomain 中的值
    * 进行覆盖
    * 
    * @param newDomain
-   *          ,
+   *          ,待覆盖的实体
    * @param oldDomain
-   *          ,被覆盖的实体
-   * @return 合并后的oldDomain
+   *          ,覆盖的实体
+   * @return 合并后的newDomain
    */
   public static <T> T merge(T newDomain, T oldDomain) {
 
@@ -39,13 +39,14 @@
         String fieldName = field.getName();
         Object newFieldValue = ReflectUtils.getFieldValue(newDomain, fieldName);
 
-        if (newFieldValue != null) {
-          ReflectUtils.setFieldValue(oldDomain, fieldName, newFieldValue);
+        if (newFieldValue == null) {
+          Object oldFieldValue = ReflectUtils.getFieldValue(oldDomain, fieldName);
+          ReflectUtils.setFieldValue(newDomain, fieldName, oldFieldValue);
         }
       }
     }
 
-    return oldDomain;
+    return newDomain;
   }
 
   public static <S, T> T copy(S sourceDomain, T targetDomain) {
diff --git a/samples/common/src/main/java/com/supwisdom/leaveschool/common/util/UUIDUtils.java b/samples/common/src/main/java/com/supwisdom/leaveschool/common/util/UUIDUtils.java
new file mode 100644
index 0000000..cb7b074
--- /dev/null
+++ b/samples/common/src/main/java/com/supwisdom/leaveschool/common/util/UUIDUtils.java
@@ -0,0 +1,87 @@
+package com.supwisdom.leaveschool.common.util;
+
+import java.math.BigInteger;
+import java.security.SecureRandom;
+import java.util.Random;
+import java.util.UUID;
+import java.util.concurrent.locks.ReentrantLock;
+
+public class UUIDUtils {
+
+  private static boolean IS_THREADLOCALRANDOM_AVAILABLE = false;
+  private static Random random;
+  private static final long leastSigBits;
+  private static final ReentrantLock lock = new ReentrantLock();
+  private static long lastTime;
+
+  static {
+    try {
+      IS_THREADLOCALRANDOM_AVAILABLE = null != UUIDUtils.class.getClassLoader().loadClass(
+          "java.util.concurrent.ThreadLocalRandom");
+    } catch (ClassNotFoundException e) {
+    }
+
+    byte[] seed = new SecureRandom().generateSeed(8);
+    leastSigBits = new BigInteger(seed).longValue();
+    if (!IS_THREADLOCALRANDOM_AVAILABLE) {
+      random = new Random(leastSigBits);
+    }
+  }
+
+  private UUIDUtils() {}
+
+  /**
+   * 生成32位随机码
+   * @return
+   */
+  public static String random() {
+    byte[] randomBytes = new byte[16];
+    if (IS_THREADLOCALRANDOM_AVAILABLE) {
+      java.util.concurrent.ThreadLocalRandom.current().nextBytes(randomBytes);
+    } else {
+      random.nextBytes(randomBytes);
+    }
+
+    long mostSigBits = 0;
+    for (int i = 0; i < 8; i++) {
+      mostSigBits = (mostSigBits << 8) | (randomBytes[i] & 0xff);
+    }
+    long leastSigBits = 0;
+    for (int i = 8; i < 16; i++) {
+      leastSigBits = (leastSigBits << 8) | (randomBytes[i] & 0xff);
+    }
+
+    return new UUID(mostSigBits, leastSigBits).toString().replaceAll("-", "");
+  }
+
+  /**
+   * 生成32位随机码
+   * @return
+   */
+  public static String create() {
+    long timeMillis = (System.currentTimeMillis() * 10000) + 0x01B21DD213814000L;
+
+    lock.lock();
+    try {
+      if (timeMillis > lastTime) {
+        lastTime = timeMillis;
+      } else {
+        timeMillis = ++lastTime;
+      }
+    } finally {
+      lock.unlock();
+    }
+
+    long mostSigBits = timeMillis << 32;
+    mostSigBits |= (timeMillis & 0xFFFF00000000L) >> 16;
+    mostSigBits |= 0x1000 | ((timeMillis >> 48) & 0x0FFF); 
+    return new UUID(mostSigBits, leastSigBits).toString().replaceAll("-", "");
+    
+  }
+  
+  public static void main(String[] args){
+    System.out.println(random());
+    System.out.println(create());
+  }
+
+}