修改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());
+ }
+
+}